module Control.Effects.List
( module Control.Effects.List
, module ListT ) where
import Interlude hiding (toList, traverse_, fold, foldMaybe, splitAt, head)
import ListT hiding (take)
import Control.Effects
data NonDeterministic
type instance EffectMsg1 NonDeterministic = []
type instance EffectRes1 NonDeterministic = Identity
type instance EffectCon1 NonDeterministic a = ()
choose :: MonadEffect1 NonDeterministic m => [a] -> m a
choose = fmap runIdentity . effect1 (Proxy :: Proxy NonDeterministic)
deadEnd :: MonadEffect1 NonDeterministic m => m a
deadEnd = choose []
handleList :: Monad m => (ListT m a -> m b) -> EffectHandler1 NonDeterministic (ListT m) a -> m b
handleList f = f . handleEffect1 (fmap Identity . fromFoldable)
evaluateToList :: Monad m => EffectHandler1 NonDeterministic (ListT m) a -> m [a]
evaluateToList = handleList toList
traverseAllResults :: Monad m => (a -> m ()) -> EffectHandler1 NonDeterministic (ListT m) a -> m ()
traverseAllResults handler = handleList (traverse_ handler)
foldAllResults :: Monad m => (r -> a -> m r) -> r
-> EffectHandler1 NonDeterministic (ListT m) a -> m r
foldAllResults f i = handleList (fold f i)
foldWithEarlyTermination :: Monad m => (r -> a -> m (Maybe r)) -> r
-> EffectHandler1 NonDeterministic (ListT m) a -> m r
foldWithEarlyTermination f i = handleList (foldMaybe f i)
evaluateNResults :: Monad m => Int -> EffectHandler1 NonDeterministic (ListT m) a -> m [a]
evaluateNResults n = handleList (fmap fst . splitAt n)
evaluateOneResult :: Monad m => EffectHandler1 NonDeterministic (ListT m) a -> m (Maybe a)
evaluateOneResult = handleList head