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