Have forceEff pretend to return a value again
This commit is contained in:
parent
3c2393e5af
commit
676994ed82
|
@ -77,11 +77,7 @@ normalForm_ :: (Framed e m,
|
|||
MonadThunk t m (NValue t f m),
|
||||
MonadDataErrorContext t f m)
|
||||
=> NValue t f m -> m ()
|
||||
normalForm_ = fmap void $ normalForm' $ \t k -> do
|
||||
forceEff t (void . k)
|
||||
-- This next return is safe, only because we never inspect this value, nor
|
||||
-- is anything returned to the user due to 'fmap void' above.
|
||||
return $ error "normalForm_: a value was expected"
|
||||
normalForm_ = void <$> normalForm' forceEff
|
||||
|
||||
removeEffects :: (MonadThunk t m (NValue t f m), MonadDataContext f m)
|
||||
=> NValue t f m -> NValueNF t f m
|
||||
|
|
|
@ -14,7 +14,7 @@ class Monad m => MonadThunk t m v | t -> m, t -> v where
|
|||
query :: t -> r -> (v -> r) -> r
|
||||
queryM :: t -> m r -> (v -> m r) -> m r
|
||||
force :: t -> (v -> m r) -> m r
|
||||
forceEff :: t -> (v -> m ()) -> m ()
|
||||
forceEff :: t -> (v -> m r) -> m r
|
||||
wrapValue :: v -> t
|
||||
getValue :: t -> Maybe v
|
||||
|
||||
|
|
|
@ -105,12 +105,12 @@ forceThunk (Thunk n active ref) k = do
|
|||
writeVar ref (Computed v)
|
||||
k v
|
||||
|
||||
forceEffects :: MonadVar m => NThunkF m v -> (v -> m ()) -> m ()
|
||||
forceEffects :: MonadVar m => NThunkF m v -> (v -> m r) -> m r
|
||||
forceEffects (Value v) k = k v
|
||||
forceEffects (Thunk _ active ref) k = do
|
||||
nowActive <- atomicModifyVar active (True,)
|
||||
if nowActive
|
||||
then return ()
|
||||
then return $ error "Loop detected"
|
||||
else do
|
||||
eres <- readVar ref
|
||||
case eres of
|
||||
|
|
Loading…
Reference in a new issue