Have forceEff pretend to return a value again

This commit is contained in:
John Wiegley 2019-03-16 13:23:38 -07:00
parent 3c2393e5af
commit 676994ed82
No known key found for this signature in database
GPG key ID: C144D8F4F19FE630
3 changed files with 4 additions and 8 deletions

View file

@ -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

View file

@ -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

View file

@ -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