19 lines
645 B
Haskell
19 lines
645 B
Haskell
{-# LANGUAGE DerivingVia #-}
|
|
module Transformer where
|
|
|
|
import Control.Category ( Category )
|
|
import Control.Arrow ( Arrow, ArrowChoice, Kleisli(Kleisli) )
|
|
import Control.Monad.Trans.Maybe ( MaybeT(MaybeT) )
|
|
|
|
newtype Transformer m a b = Transformer (a -> m (Maybe b))
|
|
deriving (Category, Arrow, ArrowChoice) via Kleisli (MaybeT m)
|
|
|
|
arrOpt :: Applicative m => (a -> Maybe b) -> Transformer m a b
|
|
arrOpt f = Transformer (pure . f)
|
|
|
|
liftTransformer :: Monad m => (a -> m b) -> Transformer m a b
|
|
liftTransformer f = Transformer (fmap Just . f)
|
|
|
|
runTransformer :: Monad m => Transformer m a b -> a -> m (Maybe b)
|
|
runTransformer (Transformer tr) = tr
|