summaryrefslogtreecommitdiffstats
path: root/app/Data/Res.hs
diff options
context:
space:
mode:
authorRutger Broekhoff2025-03-22 14:52:35 +0100
committerRutger Broekhoff2025-03-22 14:52:35 +0100
commit5493329b2eed7e151f4a323c108caad2253b08bb (patch)
treea8fd1a58e0ba77d06e75222034def5eb49043bb6 /app/Data/Res.hs
parente40e290ef216656d304f4f3095dbef223e94191d (diff)
downloadrdcapsis-5493329b2eed7e151f4a323c108caad2253b08bb.tar.gz
rdcapsis-5493329b2eed7e151f4a323c108caad2253b08bb.zip
Refactor parser for current account statement
Diffstat (limited to 'app/Data/Res.hs')
-rw-r--r--app/Data/Res.hs31
1 files changed, 31 insertions, 0 deletions
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 @@
1module Data.Res where
2
3import Control.Applicative
4import Data.String (IsString (fromString))
5
6data Res e r = Ok r | Err e
7
8instance Functor (Res e) where
9 fmap f (Ok v) = Ok (f v)
10 fmap _ (Err e) = Err e
11
12instance Applicative (Res e) where
13 pure = Ok
14 (Ok f) <*> (Ok v) = Ok (f v)
15 (Err e) <*> _ = Err e
16 _ <*> (Err e) = Err e
17
18instance Monad (Res e) where
19 (Ok v) >>= f = f v
20 (Err e) >>= _ = Err e
21
22instance IsString e => MonadFail (Res e) where
23 fail = Err . fromString
24
25instance IsString e => Alternative (Res e) where
26 empty = fail "mzero"
27 m1@(Ok _) <|> _ = m1
28 (Err _) <|> m2 = m2
29
30liftEither :: Either e r -> Res e r
31liftEither = either Err Ok