From 956a60dc5253da43dc0fddaecf88116597023fdf Mon Sep 17 00:00:00 2001 From: Tom Smeding Date: Sun, 19 Sep 2021 18:06:03 +0200 Subject: Initial --- SC/Monad.hs | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 SC/Monad.hs (limited to 'SC/Monad.hs') diff --git a/SC/Monad.hs b/SC/Monad.hs new file mode 100644 index 0000000..c58755f --- /dev/null +++ b/SC/Monad.hs @@ -0,0 +1,25 @@ +{-# LANGUAGE DerivingVia #-} +module SC.Monad where + +import Control.Monad.Trans.Class (lift) +import Control.Monad.Trans.Except +import Control.Monad.Trans.State.Strict + + +newtype SC a = SC (ExceptT String (State Int) a) + deriving (Functor, Applicative, Monad) via (ExceptT String (State Int)) + +instance MonadFail SC where + fail = throw + +evalSC :: SC a -> Either String a +evalSC (SC m) = evalState (runExceptT m) 1 + +genId :: SC Int +genId = SC $ do + value <- lift get + lift (modify (+1)) + return value + +throw :: String -> SC a +throw = SC . throwE -- cgit v1.2.3-70-g09d2