-- |
-- Module      : Common.Parsing.ParseErr
-- License     : BSD3
-- Maintainer  : tbidne@gmail.com
--
-- Provides the 'ParseErr' monoid.
module Common.Parsing.ParseErr
  ( ParseErr (..),
  )
where

-- | 'ParseErr' describes an error encountered while parsing.
-- Errors are either a request for 'Help' or some general error.
--
-- The algebra for 'ParseErr' satisfies
--
-- @
--   1. Identity: 'Err' ""
--   2. 'Help' is an ideal: 'Help' x <> 'Err' y == 'Help' x == 'Err' y <> 'Help' x
--   3. Left-biased: l <> r == l, when it doesn't violate 1 or 2.
-- @
--
-- Strictly speaking property 2 is stronger than saying 'Help' is an ideal.
-- More precisely, the action by 'Err' on 'Help' in 'ParseErr' is trivial.
data ParseErr
  = Err String
  | Help String
  deriving (ParseErr -> ParseErr -> Bool
(ParseErr -> ParseErr -> Bool)
-> (ParseErr -> ParseErr -> Bool) -> Eq ParseErr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ParseErr -> ParseErr -> Bool
$c/= :: ParseErr -> ParseErr -> Bool
== :: ParseErr -> ParseErr -> Bool
$c== :: ParseErr -> ParseErr -> Bool
Eq, Int -> ParseErr -> ShowS
[ParseErr] -> ShowS
ParseErr -> String
(Int -> ParseErr -> ShowS)
-> (ParseErr -> String) -> ([ParseErr] -> ShowS) -> Show ParseErr
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ParseErr] -> ShowS
$cshowList :: [ParseErr] -> ShowS
show :: ParseErr -> String
$cshow :: ParseErr -> String
showsPrec :: Int -> ParseErr -> ShowS
$cshowsPrec :: Int -> ParseErr -> ShowS
Show)

instance Semigroup ParseErr where
  (Err "") <> :: ParseErr -> ParseErr -> ParseErr
<> r :: ParseErr
r = ParseErr
r
  (Help l :: String
l) <> _ = String -> ParseErr
Help String
l
  (Err _) <> (Help r :: String
r) = String -> ParseErr
Help String
r
  (Err l :: String
l) <> _ = String -> ParseErr
Err String
l

instance Monoid ParseErr where
  mempty :: ParseErr
mempty = String -> ParseErr
Err ""