{-# 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 #-}