module Util.Monad.Logic.Class where import Control.Applicative import Control.Monad (MonadPlus, guard) import Control.Monad.Logic.Class infixr 7 \/ (\/) :: MonadLogic m => m a -> m a -> m a (\/) = interleave infixr 8 >< (><) :: MonadLogic m => m a -> m b -> m (a, b) (><) = liftL2 (,) infixl 4 <~> (<~>) :: MonadLogic m => m (a -> b) -> m a -> m b fs <~> as = fs >>- (<$> as) liftL2 :: MonadLogic m => (a -> b -> c) -> m a -> m b -> m c liftL2 f as bs = f <$> as <~> bs liftL3 :: MonadLogic m => (a -> b -> c -> d) -> m a -> m b -> m c -> m d liftL3 f as bs cs = f <$> as <~> bs <~> cs