module NonDetM (NonDetM, withStrat) where
import Tree
import Monad
import MT
import Control_Monad_Fix
newtype NonDetM a = ND { unND :: Tree a }
withStrat :: (Tree a -> b) -> NonDetM a -> b
withStrat f (ND m) = f m
instance Functor NonDetM where
fmap = liftM
instance Monad NonDetM where
return x = ND (return x)
ND m >>= f = ND (m >>= unND . f)
instance MonadPlus NonDetM where
mzero = ND mzero
mplus (ND x) (ND y) = ND (mplus x y)
instance HasBaseMonad NonDetM NonDetM where
inBase = id
instance MonadFix NonDetM where
mfix f = ND (mfix (unND . f))