{-# LANGUAGE GHC2024 #-}

-- | Warning helpers for markup parsing.
module Data.Markup.Warn
  ( MarkupWarning (..),
    ParserWarning (..),
    Warn,
    warnError,
    warnEither,
    warnMaybe,
    showWarnings,
    concatWarns,
  )
where

import Control.Category ((>>>))
import Data.Bifunctor
import Data.Bool
import Data.Data
import Data.List qualified as List
import Data.Markup (NameTag)
import Data.These
import GHC.Generics

-- | Warnings originating in the stream/token parser.
data ParserWarning
  = ParserLeftover String
  | ParserError String
  | ParserUncaught
  deriving (ParserWarning -> ParserWarning -> Bool
(ParserWarning -> ParserWarning -> Bool)
-> (ParserWarning -> ParserWarning -> Bool) -> Eq ParserWarning
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ParserWarning -> ParserWarning -> Bool
== :: ParserWarning -> ParserWarning -> Bool
$c/= :: ParserWarning -> ParserWarning -> Bool
/= :: ParserWarning -> ParserWarning -> Bool
Eq, Eq ParserWarning
Eq ParserWarning =>
(ParserWarning -> ParserWarning -> Ordering)
-> (ParserWarning -> ParserWarning -> Bool)
-> (ParserWarning -> ParserWarning -> Bool)
-> (ParserWarning -> ParserWarning -> Bool)
-> (ParserWarning -> ParserWarning -> Bool)
-> (ParserWarning -> ParserWarning -> ParserWarning)
-> (ParserWarning -> ParserWarning -> ParserWarning)
-> Ord ParserWarning
ParserWarning -> ParserWarning -> Bool
ParserWarning -> ParserWarning -> Ordering
ParserWarning -> ParserWarning -> ParserWarning
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ParserWarning -> ParserWarning -> Ordering
compare :: ParserWarning -> ParserWarning -> Ordering
$c< :: ParserWarning -> ParserWarning -> Bool
< :: ParserWarning -> ParserWarning -> Bool
$c<= :: ParserWarning -> ParserWarning -> Bool
<= :: ParserWarning -> ParserWarning -> Bool
$c> :: ParserWarning -> ParserWarning -> Bool
> :: ParserWarning -> ParserWarning -> Bool
$c>= :: ParserWarning -> ParserWarning -> Bool
>= :: ParserWarning -> ParserWarning -> Bool
$cmax :: ParserWarning -> ParserWarning -> ParserWarning
max :: ParserWarning -> ParserWarning -> ParserWarning
$cmin :: ParserWarning -> ParserWarning -> ParserWarning
min :: ParserWarning -> ParserWarning -> ParserWarning
Ord, Int -> ParserWarning -> ShowS
[ParserWarning] -> ShowS
ParserWarning -> String
(Int -> ParserWarning -> ShowS)
-> (ParserWarning -> String)
-> ([ParserWarning] -> ShowS)
-> Show ParserWarning
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ParserWarning -> ShowS
showsPrec :: Int -> ParserWarning -> ShowS
$cshow :: ParserWarning -> String
show :: ParserWarning -> String
$cshowList :: [ParserWarning] -> ShowS
showList :: [ParserWarning] -> ShowS
Show, (forall x. ParserWarning -> Rep ParserWarning x)
-> (forall x. Rep ParserWarning x -> ParserWarning)
-> Generic ParserWarning
forall x. Rep ParserWarning x -> ParserWarning
forall x. ParserWarning -> Rep ParserWarning x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ParserWarning -> Rep ParserWarning x
from :: forall x. ParserWarning -> Rep ParserWarning x
$cto :: forall x. Rep ParserWarning x -> ParserWarning
to :: forall x. Rep ParserWarning x -> ParserWarning
Generic, Typeable ParserWarning
Typeable ParserWarning =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> ParserWarning -> c ParserWarning)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c ParserWarning)
-> (ParserWarning -> Constr)
-> (ParserWarning -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c ParserWarning))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c ParserWarning))
-> ((forall b. Data b => b -> b) -> ParserWarning -> ParserWarning)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> ParserWarning -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> ParserWarning -> r)
-> (forall u. (forall d. Data d => d -> u) -> ParserWarning -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> ParserWarning -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> ParserWarning -> m ParserWarning)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> ParserWarning -> m ParserWarning)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> ParserWarning -> m ParserWarning)
-> Data ParserWarning
ParserWarning -> Constr
ParserWarning -> DataType
(forall b. Data b => b -> b) -> ParserWarning -> ParserWarning
forall a.
Typeable a =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> ParserWarning -> u
forall u. (forall d. Data d => d -> u) -> ParserWarning -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ParserWarning -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ParserWarning -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ParserWarning -> m ParserWarning
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ParserWarning -> m ParserWarning
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ParserWarning
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ParserWarning -> c ParserWarning
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ParserWarning)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ParserWarning)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ParserWarning -> c ParserWarning
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> ParserWarning -> c ParserWarning
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ParserWarning
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c ParserWarning
$ctoConstr :: ParserWarning -> Constr
toConstr :: ParserWarning -> Constr
$cdataTypeOf :: ParserWarning -> DataType
dataTypeOf :: ParserWarning -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ParserWarning)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c ParserWarning)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ParserWarning)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c ParserWarning)
$cgmapT :: (forall b. Data b => b -> b) -> ParserWarning -> ParserWarning
gmapT :: (forall b. Data b => b -> b) -> ParserWarning -> ParserWarning
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ParserWarning -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> ParserWarning -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ParserWarning -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> ParserWarning -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> ParserWarning -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> ParserWarning -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> ParserWarning -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> ParserWarning -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ParserWarning -> m ParserWarning
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> ParserWarning -> m ParserWarning
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ParserWarning -> m ParserWarning
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ParserWarning -> m ParserWarning
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ParserWarning -> m ParserWarning
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> ParserWarning -> m ParserWarning
Data)

-- | markup-parse generally tries to continue on parse errors, and return what has/can still be parsed, together with any warnings.
data MarkupWarning
  = -- | A tag ending with "/>" that is not an element of 'selfClosers' (Html only).
    BadEmptyElemTag
  | -- | A tag ending with "/>" that has children. Cannot happen in the parsing phase.
    SelfCloserWithChildren
  | -- | Only a 'StartTag' can have child tokens.
    LeafWithChildren
  | -- | A CloseTag with a different name to the currently open StartTag.
    TagMismatch NameTag NameTag
  | -- | An EndTag with no corresponding StartTag.
    UnmatchedEndTag
  | -- | An StartTag with no corresponding EndTag.
    UnclosedTag
  | -- | An EndTag should never appear in 'Markup'
    EndTagInTree
  | -- | Empty Content, Comment, Decl or Doctype
    EmptyContent
  | -- | Badly formed declaration
    BadDecl
  | MarkupParser ParserWarning
  deriving (MarkupWarning -> MarkupWarning -> Bool
(MarkupWarning -> MarkupWarning -> Bool)
-> (MarkupWarning -> MarkupWarning -> Bool) -> Eq MarkupWarning
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MarkupWarning -> MarkupWarning -> Bool
== :: MarkupWarning -> MarkupWarning -> Bool
$c/= :: MarkupWarning -> MarkupWarning -> Bool
/= :: MarkupWarning -> MarkupWarning -> Bool
Eq, Eq MarkupWarning
Eq MarkupWarning =>
(MarkupWarning -> MarkupWarning -> Ordering)
-> (MarkupWarning -> MarkupWarning -> Bool)
-> (MarkupWarning -> MarkupWarning -> Bool)
-> (MarkupWarning -> MarkupWarning -> Bool)
-> (MarkupWarning -> MarkupWarning -> Bool)
-> (MarkupWarning -> MarkupWarning -> MarkupWarning)
-> (MarkupWarning -> MarkupWarning -> MarkupWarning)
-> Ord MarkupWarning
MarkupWarning -> MarkupWarning -> Bool
MarkupWarning -> MarkupWarning -> Ordering
MarkupWarning -> MarkupWarning -> MarkupWarning
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: MarkupWarning -> MarkupWarning -> Ordering
compare :: MarkupWarning -> MarkupWarning -> Ordering
$c< :: MarkupWarning -> MarkupWarning -> Bool
< :: MarkupWarning -> MarkupWarning -> Bool
$c<= :: MarkupWarning -> MarkupWarning -> Bool
<= :: MarkupWarning -> MarkupWarning -> Bool
$c> :: MarkupWarning -> MarkupWarning -> Bool
> :: MarkupWarning -> MarkupWarning -> Bool
$c>= :: MarkupWarning -> MarkupWarning -> Bool
>= :: MarkupWarning -> MarkupWarning -> Bool
$cmax :: MarkupWarning -> MarkupWarning -> MarkupWarning
max :: MarkupWarning -> MarkupWarning -> MarkupWarning
$cmin :: MarkupWarning -> MarkupWarning -> MarkupWarning
min :: MarkupWarning -> MarkupWarning -> MarkupWarning
Ord, Int -> MarkupWarning -> ShowS
[MarkupWarning] -> ShowS
MarkupWarning -> String
(Int -> MarkupWarning -> ShowS)
-> (MarkupWarning -> String)
-> ([MarkupWarning] -> ShowS)
-> Show MarkupWarning
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MarkupWarning -> ShowS
showsPrec :: Int -> MarkupWarning -> ShowS
$cshow :: MarkupWarning -> String
show :: MarkupWarning -> String
$cshowList :: [MarkupWarning] -> ShowS
showList :: [MarkupWarning] -> ShowS
Show, (forall x. MarkupWarning -> Rep MarkupWarning x)
-> (forall x. Rep MarkupWarning x -> MarkupWarning)
-> Generic MarkupWarning
forall x. Rep MarkupWarning x -> MarkupWarning
forall x. MarkupWarning -> Rep MarkupWarning x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. MarkupWarning -> Rep MarkupWarning x
from :: forall x. MarkupWarning -> Rep MarkupWarning x
$cto :: forall x. Rep MarkupWarning x -> MarkupWarning
to :: forall x. Rep MarkupWarning x -> MarkupWarning
Generic, Typeable MarkupWarning
Typeable MarkupWarning =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> MarkupWarning -> c MarkupWarning)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c MarkupWarning)
-> (MarkupWarning -> Constr)
-> (MarkupWarning -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c MarkupWarning))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e))
    -> Maybe (c MarkupWarning))
-> ((forall b. Data b => b -> b) -> MarkupWarning -> MarkupWarning)
-> (forall r r'.
    (r -> r' -> r)
    -> r -> (forall d. Data d => d -> r') -> MarkupWarning -> r)
-> (forall r r'.
    (r' -> r -> r)
    -> r -> (forall d. Data d => d -> r') -> MarkupWarning -> r)
-> (forall u. (forall d. Data d => d -> u) -> MarkupWarning -> [u])
-> (forall u.
    Int -> (forall d. Data d => d -> u) -> MarkupWarning -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> MarkupWarning -> m MarkupWarning)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> MarkupWarning -> m MarkupWarning)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> MarkupWarning -> m MarkupWarning)
-> Data MarkupWarning
MarkupWarning -> Constr
MarkupWarning -> DataType
(forall b. Data b => b -> b) -> MarkupWarning -> MarkupWarning
forall a.
Typeable a =>
(forall (c :: * -> *).
 (forall d b. Data d => c (d -> b) -> d -> c b)
 -> (forall g. g -> c g) -> a -> c a)
-> (forall (c :: * -> *).
    (forall b r. Data b => c (b -> r) -> c r)
    -> (forall r. r -> c r) -> Constr -> c a)
-> (a -> Constr)
-> (a -> DataType)
-> (forall (t :: * -> *) (c :: * -> *).
    Typeable t =>
    (forall d. Data d => c (t d)) -> Maybe (c a))
-> (forall (t :: * -> * -> *) (c :: * -> *).
    Typeable t =>
    (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a))
-> ((forall b. Data b => b -> b) -> a -> a)
-> (forall r r'.
    (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall r r'.
    (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r)
-> (forall u. (forall d. Data d => d -> u) -> a -> [u])
-> (forall u. Int -> (forall d. Data d => d -> u) -> a -> u)
-> (forall (m :: * -> *).
    Monad m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> (forall (m :: * -> *).
    MonadPlus m =>
    (forall d. Data d => d -> m d) -> a -> m a)
-> Data a
forall u. Int -> (forall d. Data d => d -> u) -> MarkupWarning -> u
forall u. (forall d. Data d => d -> u) -> MarkupWarning -> [u]
forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MarkupWarning -> r
forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MarkupWarning -> r
forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> MarkupWarning -> m MarkupWarning
forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> MarkupWarning -> m MarkupWarning
forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MarkupWarning
forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MarkupWarning -> c MarkupWarning
forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MarkupWarning)
forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MarkupWarning)
$cgfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MarkupWarning -> c MarkupWarning
gfoldl :: forall (c :: * -> *).
(forall d b. Data d => c (d -> b) -> d -> c b)
-> (forall g. g -> c g) -> MarkupWarning -> c MarkupWarning
$cgunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MarkupWarning
gunfold :: forall (c :: * -> *).
(forall b r. Data b => c (b -> r) -> c r)
-> (forall r. r -> c r) -> Constr -> c MarkupWarning
$ctoConstr :: MarkupWarning -> Constr
toConstr :: MarkupWarning -> Constr
$cdataTypeOf :: MarkupWarning -> DataType
dataTypeOf :: MarkupWarning -> DataType
$cdataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MarkupWarning)
dataCast1 :: forall (t :: * -> *) (c :: * -> *).
Typeable t =>
(forall d. Data d => c (t d)) -> Maybe (c MarkupWarning)
$cdataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MarkupWarning)
dataCast2 :: forall (t :: * -> * -> *) (c :: * -> *).
Typeable t =>
(forall d e. (Data d, Data e) => c (t d e))
-> Maybe (c MarkupWarning)
$cgmapT :: (forall b. Data b => b -> b) -> MarkupWarning -> MarkupWarning
gmapT :: (forall b. Data b => b -> b) -> MarkupWarning -> MarkupWarning
$cgmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MarkupWarning -> r
gmapQl :: forall r r'.
(r -> r' -> r)
-> r -> (forall d. Data d => d -> r') -> MarkupWarning -> r
$cgmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MarkupWarning -> r
gmapQr :: forall r r'.
(r' -> r -> r)
-> r -> (forall d. Data d => d -> r') -> MarkupWarning -> r
$cgmapQ :: forall u. (forall d. Data d => d -> u) -> MarkupWarning -> [u]
gmapQ :: forall u. (forall d. Data d => d -> u) -> MarkupWarning -> [u]
$cgmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> MarkupWarning -> u
gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> MarkupWarning -> u
$cgmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> MarkupWarning -> m MarkupWarning
gmapM :: forall (m :: * -> *).
Monad m =>
(forall d. Data d => d -> m d) -> MarkupWarning -> m MarkupWarning
$cgmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> MarkupWarning -> m MarkupWarning
gmapMp :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> MarkupWarning -> m MarkupWarning
$cgmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> MarkupWarning -> m MarkupWarning
gmapMo :: forall (m :: * -> *).
MonadPlus m =>
(forall d. Data d => d -> m d) -> MarkupWarning -> m MarkupWarning
Data)

-- | A type synonym for the common returning type of many functions. A common computation pipeline is to take advantage of the 'These' Monad instance eg
--
-- > markup s bs = bs & (tokenize s >=> gather s) & second (Markup s)
type Warn a = These [MarkupWarning] a

-- | Convert any warnings to an 'error'
warnError :: Warn a -> a
warnError :: forall a. Warn a -> a
warnError = ([MarkupWarning] -> a)
-> (a -> a)
-> ([MarkupWarning] -> a -> a)
-> These [MarkupWarning] a
-> a
forall a c b.
(a -> c) -> (b -> c) -> (a -> b -> c) -> These a b -> c
these ([MarkupWarning] -> String
showWarnings ([MarkupWarning] -> String)
-> (String -> a) -> [MarkupWarning] -> a
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> String -> a
forall a. HasCallStack => String -> a
error) a -> a
forall a. a -> a
id (\[MarkupWarning]
xs a
a -> a -> a -> Bool -> a
forall a. a -> a -> Bool -> a
bool (String -> a
forall a. HasCallStack => String -> a
error ([MarkupWarning] -> String
showWarnings [MarkupWarning]
xs)) a
a ([MarkupWarning] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [MarkupWarning]
xs))

-- | Returns Left on any warnings
warnEither :: Warn a -> Either [MarkupWarning] a
warnEither :: forall a. Warn a -> Either [MarkupWarning] a
warnEither = ([MarkupWarning] -> Either [MarkupWarning] a)
-> (a -> Either [MarkupWarning] a)
-> ([MarkupWarning] -> a -> Either [MarkupWarning] a)
-> These [MarkupWarning] a
-> Either [MarkupWarning] a
forall a c b.
(a -> c) -> (b -> c) -> (a -> b -> c) -> These a b -> c
these [MarkupWarning] -> Either [MarkupWarning] a
forall a b. a -> Either a b
Left a -> Either [MarkupWarning] a
forall a b. b -> Either a b
Right (\[MarkupWarning]
xs a
a -> Either [MarkupWarning] a
-> Either [MarkupWarning] a -> Bool -> Either [MarkupWarning] a
forall a. a -> a -> Bool -> a
bool ([MarkupWarning] -> Either [MarkupWarning] a
forall a b. a -> Either a b
Left [MarkupWarning]
xs) (a -> Either [MarkupWarning] a
forall a b. b -> Either a b
Right a
a) ([MarkupWarning] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [MarkupWarning]
xs))

-- | Returns results, if any, ignoring warnings.
warnMaybe :: Warn a -> Maybe a
warnMaybe :: forall a. Warn a -> Maybe a
warnMaybe = ([MarkupWarning] -> Maybe a)
-> (a -> Maybe a)
-> ([MarkupWarning] -> a -> Maybe a)
-> These [MarkupWarning] a
-> Maybe a
forall a c b.
(a -> c) -> (b -> c) -> (a -> b -> c) -> These a b -> c
these (Maybe a -> [MarkupWarning] -> Maybe a
forall a b. a -> b -> a
const Maybe a
forall a. Maybe a
Nothing) a -> Maybe a
forall a. a -> Maybe a
Just (\[MarkupWarning]
_ a
a -> a -> Maybe a
forall a. a -> Maybe a
Just a
a)

showWarnings :: [MarkupWarning] -> String
showWarnings :: [MarkupWarning] -> String
showWarnings = [MarkupWarning] -> [MarkupWarning]
forall a. Eq a => [a] -> [a]
List.nub ([MarkupWarning] -> [MarkupWarning])
-> ([MarkupWarning] -> String) -> [MarkupWarning] -> String
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> (MarkupWarning -> String) -> [MarkupWarning] -> [String]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap MarkupWarning -> String
forall a. Show a => a -> String
show ([MarkupWarning] -> [String])
-> ([String] -> String) -> [MarkupWarning] -> String
forall {k} (cat :: k -> k -> *) (a :: k) (b :: k) (c :: k).
Category cat =>
cat a b -> cat b c -> cat a c
>>> [String] -> String
unlines

concatWarns :: [Warn [a]] -> Warn [a]
concatWarns :: forall a. [Warn [a]] -> Warn [a]
concatWarns [Warn [a]]
rs = case ([[MarkupWarning]] -> [MarkupWarning])
-> ([[a]] -> [a])
-> ([[MarkupWarning]], [[a]])
-> ([MarkupWarning], [a])
forall a b c d. (a -> b) -> (c -> d) -> (a, c) -> (b, d)
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap [[MarkupWarning]] -> [MarkupWarning]
forall a. Monoid a => [a] -> a
mconcat [[a]] -> [a]
forall a. Monoid a => [a] -> a
mconcat (([[MarkupWarning]], [[a]]) -> ([MarkupWarning], [a]))
-> ([[MarkupWarning]], [[a]]) -> ([MarkupWarning], [a])
forall a b. (a -> b) -> a -> b
$ [Warn [a]] -> ([[MarkupWarning]], [[a]])
forall a b. [These a b] -> ([a], [b])
partitionHereThere [Warn [a]]
rs of
  ([], [a]
xs) -> [a] -> Warn [a]
forall a b. b -> These a b
That [a]
xs
  ([MarkupWarning]
es, []) -> [MarkupWarning] -> Warn [a]
forall a b. a -> These a b
This [MarkupWarning]
es
  ([MarkupWarning]
es, [a]
xs) -> [MarkupWarning] -> [a] -> Warn [a]
forall a b. a -> b -> These a b
These [MarkupWarning]
es [a]
xs