blob: 3bb87366e6dd7b0c9f10b8dd094b771387add078 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
module Erebos.Error (
ErebosError(..),
showErebosError,
FromErebosError(..),
throwOtherError,
) where
import Control.Monad.Except
data ErebosError
= ManyErrors [ ErebosError ]
| OtherError String
showErebosError :: ErebosError -> String
showErebosError (ManyErrors errs) = unlines $ map showErebosError errs
showErebosError (OtherError str) = str
instance Semigroup ErebosError where
ManyErrors [] <> b = b
a <> ManyErrors [] = a
ManyErrors a <> ManyErrors b = ManyErrors (a ++ b)
ManyErrors a <> b = ManyErrors (a ++ [ b ])
a <> ManyErrors b = ManyErrors (a : b)
a@OtherError {} <> b@OtherError {} = ManyErrors [ a, b ]
instance Monoid ErebosError where
mempty = ManyErrors []
class FromErebosError e where
fromErebosError :: ErebosError -> e
instance FromErebosError ErebosError where
fromErebosError = id
throwOtherError :: (MonadError e m, FromErebosError e) => String -> m a
throwOtherError = throwError . fromErebosError . OtherError
|