packages feed

Kawaii-Parser-0.0.0: Parser/Transf.hs

{-# OPTIONS_GHC -Wall #-}
{-|
Description: Type synonyms and run functions for pairwise compositions of reader, writer and state transformers.

* RST
* RWT
* WST
-}
module Parser.Transf (RST, RWT, WST, evalRST, evalWST, execRST, execRWT, execWST, runRST, runRWT, runWST) where
  import Control.Monad.RWS.Strict (RWST (..))
  -- | The composition of reader and state transformers.
  type RST env = RWST env ()
  -- | The composition of reader and writer transformers.
  type RWT env res = RWST env res ()
  -- | The composition of writer and state transformers.
  type WST = RWST ()
  -- | Discards the end state.
  evalRST :: Functor f => RST env state f t -> env -> state -> f t
  evalRST (RWST f) env st = (\(x, _, _) -> x) <$> f env st
  -- | Discards the end state.
  evalWST :: Functor f => WST res state f t -> state -> f (t, res)
  evalWST (RWST f) st = (\(x, _, res) -> (x, res)) <$> f () st
  -- | Discards the output.
  execRST :: Functor f => RST env state f t -> env -> state -> f state
  execRST (RWST f) env st = (\(_, st', _) -> st') <$> f env st
  -- | Discards the output.
  execRWT :: Functor f => RWT env res f t -> env -> f res
  execRWT (RWST f) env = (\(_, (), res) -> res) <$> f env ()
  -- | Discards the output.
  execWST :: Functor f => WST res state f t -> state -> f (state, res)
  execWST (RWST f) st = (\(_, st', res) -> (st', res)) <$> f () st
  -- | Runs the RS transformer.
  runRST :: Functor f => RST env state f t -> env -> state -> f (t, state)
  runRST (RWST f) env st = (\(x, st', ()) -> (x, st')) <$> f env st
  -- | Runs the RW transformer.
  runRWT :: Functor f => RWT env res f t -> env -> f (t, res)
  runRWT (RWST f) env = (\(x, (), res) -> (x, res)) <$> f env ()
  -- | Runs the WS transformer.
  runWST :: WST res state f t -> state -> f (t, state, res)
  runWST (RWST f) = f ()