module Text.Trifecta.Diagnostic.Err
( Err(..)
, knownErr
, fatalErr
) where
import Control.Applicative
import Data.Foldable
import Data.Traversable
import Data.Semigroup
import Data.Functor.Plus
import Text.Trifecta.Diagnostic.Prim
import Text.Trifecta.Diagnostic.Level
import Text.Trifecta.Diagnostic.Rendering.Prim
import Text.PrettyPrint.Free
data Err e
= EmptyErr
| FailErr String
| PanicErr String
| Err [Rendering] !DiagnosticLevel e [Diagnostic e]
deriving Show
knownErr :: Err e -> Bool
knownErr EmptyErr = False
knownErr _ = True
fatalErr :: Err e -> Bool
fatalErr (Err _ Fatal _ _) = True
fatalErr (PanicErr _) = True
fatalErr _ = False
instance Functor Err where
fmap _ EmptyErr = EmptyErr
fmap _ (FailErr s) = FailErr s
fmap _ (PanicErr s) = PanicErr s
fmap f (Err rs l e es) = Err rs l (f e) (fmap (fmap f) es)
instance Foldable Err where
foldMap _ EmptyErr = mempty
foldMap _ FailErr{} = mempty
foldMap _ PanicErr{} = mempty
foldMap f (Err _ _ e ds) = f e `mappend` foldMap (foldMap f) ds
instance Traversable Err where
traverse _ EmptyErr = pure EmptyErr
traverse _ (FailErr s) = pure $ FailErr s
traverse _ (PanicErr s) = pure $ PanicErr s
traverse f (Err rs l e ds) = Err rs l <$> f e <*> traverse (traverse f) ds
instance Alt Err where
a <!> EmptyErr = a
_ <!> a@(Err _ Fatal _ _) = a
a@(Err _ Fatal _ _) <!> _ = a
_ <!> a@PanicErr{} = a
a@PanicErr{} <!> _ = a
_ <!> b = b
instance Plus Err where
zero = EmptyErr
instance Semigroup (Err t) where
(<>) = (<!>)
times1p _ = id
instance Monoid (Err t) where
mempty = EmptyErr
mappend = (<!>)