module Control.Monad.IO.Logic
( LogicIO
, runLogicIO
, observeIO
, observeAllIO
, observeManyIO
, liftST
) where
#ifdef MODULE_Control_Monad_ST_Safe
import Control.Monad.ST.Safe
#else
import Control.Monad.ST
#endif
import Control.Monad.ST.Logic.Internal hiding (liftST)
import qualified Control.Monad.ST.Logic.Internal as Internal
type LogicIO s = LogicT s IO
runLogicIO :: (forall s . LogicIO s a) -> (a -> IO r -> IO r) -> IO r -> IO r
runLogicIO = runLogicT
observeIO :: (forall s . LogicIO s a) -> IO a
observeIO = observeT
observeAllIO :: (forall s . LogicIO s a) -> IO [a]
observeAllIO = observeAllT
observeManyIO :: Int -> (forall s . LogicIO s a) -> IO [a]
observeManyIO = observeManyT
liftST :: ST RealWorld a -> LogicIO s a
liftST = Internal.liftST