From 5493329b2eed7e151f4a323c108caad2253b08bb Mon Sep 17 00:00:00 2001 From: Rutger Broekhoff Date: Sat, 22 Mar 2025 14:52:35 +0100 Subject: Refactor parser for current account statement --- app/Data/Res.hs | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 app/Data/Res.hs (limited to 'app/Data/Res.hs') diff --git a/app/Data/Res.hs b/app/Data/Res.hs new file mode 100644 index 0000000..e8c4ca4 --- /dev/null +++ b/app/Data/Res.hs @@ -0,0 +1,31 @@ +module Data.Res where + +import Control.Applicative +import Data.String (IsString (fromString)) + +data Res e r = Ok r | Err e + +instance Functor (Res e) where + fmap f (Ok v) = Ok (f v) + fmap _ (Err e) = Err e + +instance Applicative (Res e) where + pure = Ok + (Ok f) <*> (Ok v) = Ok (f v) + (Err e) <*> _ = Err e + _ <*> (Err e) = Err e + +instance Monad (Res e) where + (Ok v) >>= f = f v + (Err e) >>= _ = Err e + +instance IsString e => MonadFail (Res e) where + fail = Err . fromString + +instance IsString e => Alternative (Res e) where + empty = fail "mzero" + m1@(Ok _) <|> _ = m1 + (Err _) <|> m2 = m2 + +liftEither :: Either e r -> Res e r +liftEither = either Err Ok -- cgit v1.2.3