{-# LANGUAGE CPP #-} {-# LANGUAGE ViewPatterns #-} module Control.Monad.Logic.Sequence.Compat ( fromSeqT , toLogicT , fromLogicT , observeT , observe ) where import Control.Monad.Identity (Identity(..)) import Control.Monad.Logic.Sequence.Internal hiding ( observeT, observe ) #if !MIN_VERSION_base(4,13,0) observeT :: Monad m => SeqT m a -> m a #else observeT :: MonadFail m => SeqT m a -> m a #endif observeT :: forall (m :: * -> *) a. MonadFail m => SeqT m a -> m a observeT (forall (m :: * -> *) a. Monad m => SeqT m a -> m (ViewT m a) toViewT -> m (ViewT m a) m) = m (ViewT m a) m forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b >>= forall {m :: * -> *} {m :: * -> *} {a}. MonadFail m => ViewT m a -> m a go where go :: ViewT m a -> m a go (a a :< SeqT m a _) = forall (m :: * -> *) a. Monad m => a -> m a return a a go ViewT m a Empty = forall (m :: * -> *) a. MonadFail m => String -> m a fail String "No results." {-# INLINE observeT #-} observe :: Seq a -> a observe :: forall a. Seq a -> a observe (forall (m :: * -> *) a. Monad m => SeqT m a -> m (ViewT m a) toViewT -> Identity (ViewT Identity a) m) = case forall a. Identity a -> a runIdentity Identity (ViewT Identity a) m of a a :< Seq a _ -> a a ViewT Identity a Empty -> forall a. HasCallStack => String -> a error String "No results." {-# INLINE observe #-}