module Control.Effects.List
( module Control.Effects.List
, module ListT ) where
import Prelude hiding (splitAt, head)
import Import
import ListT hiding (take)
import Control.Effects
import Data.Kind
newtype NonDeterministic = Choose Type
data instance Effect NonDeterministic method mr where
ChooseMsg :: { getChooseMsg :: [a] } -> Effect NonDeterministic ('Choose a) 'Msg
ChooseRes :: { getChooseRes :: a } -> Effect NonDeterministic ('Choose a) 'Res
instance Monad m => MonadEffect NonDeterministic (ListT m) where
effect (ChooseMsg list) = ChooseRes <$> fromFoldable list
choose :: MonadEffect NonDeterministic m => [a] -> m a
choose = fmap getChooseRes . effect . ChooseMsg
deadEnd :: MonadEffect NonDeterministic m => m a
deadEnd = choose []
evaluateToList :: Monad m => ListT m a -> m [a]
evaluateToList = toList
traverseAllResults :: Monad m => (a -> m ()) -> ListT m a -> m ()
traverseAllResults = traverse_
foldAllResults :: Monad m => (r -> a -> m r) -> r -> ListT m a -> m r
foldAllResults = fold
foldWithEarlyTermination :: Monad m => (r -> a -> m (Maybe r)) -> r -> ListT m a -> m r
foldWithEarlyTermination = foldMaybe
evaluateNResults :: Monad m => Int -> ListT m a -> m [a]
evaluateNResults n = fmap fst . splitAt n
evaluateOneResult :: Monad m => ListT m a -> m (Maybe a)
evaluateOneResult = head