monad-choice-0.1.0.0: src/Control/Monad/Choice/Covariant.hs
{-# LANGUAGE RankNTypes #-}
{-|
Module : Control.Monad.Choice.Covariant
Copyright : (c) Eamon Olive, 2020
(c) Louis Hyde, 2020
License : AGPL-3
Maintainer : ejolive97@gmail.com
Stability : experimental
-}
module Control.Monad.Choice.Covariant
( Choice
, runChoice
, runChoiceM
, runBacktrackableChoiceM
) where
-- Internal imports
import Control.Monad.Trans.Choice.Covariant
( ChoiceT
, mapChoiceT
, runBacktrackableChoiceT
, runChoiceT
)
-- External imports
import Control.Monad.Identity
( Identity
, runIdentity
)
type Choice f = ChoiceT f Identity
runChoice :: (forall x. f x -> x) -> Choice f a -> a
runChoice chooser = runIdentity . runChoiceT (pure . chooser)
runChoiceM :: Monad m => (forall x. f x -> m x) -> Choice f a -> m a
runChoiceM chooser = runChoiceT chooser . mapChoiceT (pure . runIdentity)
runBacktrackableChoiceM :: Monad m => (forall x. f x -> m (Maybe x)) -> Choice f a -> m (Maybe a)
runBacktrackableChoiceM chooser = runBacktrackableChoiceT chooser . mapChoiceT (pure . runIdentity)