{-# LANGUAGE Safe #-}
{-# OPTIONS_GHC -Wno-incomplete-record-updates #-}
module Text.Gigaparsec.Errors.Patterns (
    verifiedWith,
    verifiedFail, verifiedUnexpected, verifiedExplain,
    preventWith,
    preventativeFail, preventativeExplain
  ) where

import Text.Gigaparsec (Parsec, atomic, (<+>), unit)
import Text.Gigaparsec.Position (withWidth)
import Text.Gigaparsec.Errors.Combinator (amend, hide)
import Text.Gigaparsec.Errors.ErrorGen (ErrorGen)
import Text.Gigaparsec.Errors.ErrorGen qualified as ErrorGen (
    asFail, asSelect, UnexpectedItem(RawItem),
    vanillaGen, specializedGen, unexpected, reason, messages
  )

{-
@since 0.2.3.0
-}
verifiedWith :: ErrorGen a -> Parsec a -> Parsec b
verifiedWith :: forall a b. ErrorGen a -> Parsec a -> Parsec b
verifiedWith ErrorGen a
err Parsec a
p = Parsec b -> Parsec b
forall a. Parsec a -> Parsec a
amend (ErrorGen a -> Parsec (a, Word) -> Parsec b
forall a b. ErrorGen a -> Parsec (a, Word) -> Parsec b
ErrorGen.asFail ErrorGen a
err (Parsec (a, Word) -> Parsec (a, Word)
forall a. Parsec a -> Parsec a
hide (Parsec a -> Parsec (a, Word)
forall a. Parsec a -> Parsec (a, Word)
withWidth (Parsec a -> Parsec a
forall a. Parsec a -> Parsec a
atomic Parsec a
p))))

verifiedWithVanilla :: (a -> ErrorGen.UnexpectedItem) -> (a -> Maybe String) -> Parsec a -> Parsec b
verifiedWithVanilla :: forall a b.
(a -> UnexpectedItem)
-> (a -> Maybe String) -> Parsec a -> Parsec b
verifiedWithVanilla a -> UnexpectedItem
unexGen a -> Maybe String
reasonGen = ErrorGen a -> Parsec a -> Parsec b
forall a b. ErrorGen a -> Parsec a -> Parsec b
verifiedWith (ErrorGen a -> Parsec a -> Parsec b)
-> ErrorGen a -> Parsec a -> Parsec b
forall a b. (a -> b) -> a -> b
$
  ErrorGen a
forall a. ErrorGen a
ErrorGen.vanillaGen {
    ErrorGen.unexpected = unexGen,
    ErrorGen.reason = reasonGen
  }

verifiedWithVanillaRaw :: (a -> Maybe String) -> Parsec a -> Parsec b
verifiedWithVanillaRaw :: forall a b. (a -> Maybe String) -> Parsec a -> Parsec b
verifiedWithVanillaRaw = (a -> UnexpectedItem)
-> (a -> Maybe String) -> Parsec a -> Parsec b
forall a b.
(a -> UnexpectedItem)
-> (a -> Maybe String) -> Parsec a -> Parsec b
verifiedWithVanilla (UnexpectedItem -> a -> UnexpectedItem
forall a b. a -> b -> a
const UnexpectedItem
ErrorGen.RawItem)

{-
@since 0.2.3.0
-}
verifiedFail :: (a -> [String]) -> Parsec a -> Parsec b
verifiedFail :: forall a b. (a -> [String]) -> Parsec a -> Parsec b
verifiedFail a -> [String]
msggen = ErrorGen a -> Parsec a -> Parsec b
forall a b. ErrorGen a -> Parsec a -> Parsec b
verifiedWith (ErrorGen a -> Parsec a -> Parsec b)
-> ErrorGen a -> Parsec a -> Parsec b
forall a b. (a -> b) -> a -> b
$
  ErrorGen a
forall a. ErrorGen a
ErrorGen.specializedGen {
    ErrorGen.messages = msggen
  }

{-
@since 0.2.3.0
-}
verifiedUnexpected :: Parsec a -> Parsec b
verifiedUnexpected :: forall a b. Parsec a -> Parsec b
verifiedUnexpected = (a -> Maybe String) -> Parsec a -> Parsec b
forall a b. (a -> Maybe String) -> Parsec a -> Parsec b
verifiedWithVanillaRaw (Maybe String -> a -> Maybe String
forall a b. a -> b -> a
const Maybe String
forall a. Maybe a
Nothing)

{-
@since 0.2.3.0
-}
verifiedExplain :: (a -> String) -> Parsec a -> Parsec b
verifiedExplain :: forall a b. (a -> String) -> Parsec a -> Parsec b
verifiedExplain a -> String
reasongen = (a -> Maybe String) -> Parsec a -> Parsec b
forall a b. (a -> Maybe String) -> Parsec a -> Parsec b
verifiedWithVanillaRaw (String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> (a -> String) -> a -> Maybe String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
reasongen)

{-
@since 0.2.3.0
-}
preventWith :: ErrorGen a -> Parsec a -> Parsec ()
preventWith :: forall a. ErrorGen a -> Parsec a -> Parsec ()
preventWith ErrorGen a
err Parsec a
p = Parsec () -> Parsec ()
forall a. Parsec a -> Parsec a
amend (ErrorGen a -> Parsec (Either (a, Word) ()) -> Parsec ()
forall a b. ErrorGen a -> Parsec (Either (a, Word) b) -> Parsec b
ErrorGen.asSelect ErrorGen a
err (Parsec a -> Parsec (a, Word)
forall a. Parsec a -> Parsec (a, Word)
withWidth (Parsec a -> Parsec a
forall a. Parsec a -> Parsec a
hide (Parsec a -> Parsec a
forall a. Parsec a -> Parsec a
atomic Parsec a
p)) Parsec (a, Word) -> Parsec () -> Parsec (Either (a, Word) ())
forall a b. Parsec a -> Parsec b -> Parsec (Either a b)
<+> Parsec ()
unit))

preventWithVanilla :: (a -> ErrorGen.UnexpectedItem) -> (a -> Maybe String) -> Parsec a -> Parsec ()
preventWithVanilla :: forall a.
(a -> UnexpectedItem)
-> (a -> Maybe String) -> Parsec a -> Parsec ()
preventWithVanilla a -> UnexpectedItem
unexGen a -> Maybe String
reasonGen = ErrorGen a -> Parsec a -> Parsec ()
forall a. ErrorGen a -> Parsec a -> Parsec ()
preventWith (ErrorGen a -> Parsec a -> Parsec ())
-> ErrorGen a -> Parsec a -> Parsec ()
forall a b. (a -> b) -> a -> b
$
  ErrorGen a
forall a. ErrorGen a
ErrorGen.vanillaGen {
    ErrorGen.unexpected = unexGen,
    ErrorGen.reason = reasonGen
  }

preventWithVanillaRaw :: (a -> Maybe String) -> Parsec a -> Parsec ()
preventWithVanillaRaw :: forall a. (a -> Maybe String) -> Parsec a -> Parsec ()
preventWithVanillaRaw = (a -> UnexpectedItem)
-> (a -> Maybe String) -> Parsec a -> Parsec ()
forall a.
(a -> UnexpectedItem)
-> (a -> Maybe String) -> Parsec a -> Parsec ()
preventWithVanilla (UnexpectedItem -> a -> UnexpectedItem
forall a b. a -> b -> a
const UnexpectedItem
ErrorGen.RawItem)

{-
@since 0.2.3.0
-}
preventativeFail :: (a -> [String]) -> Parsec a -> Parsec ()
preventativeFail :: forall a. (a -> [String]) -> Parsec a -> Parsec ()
preventativeFail a -> [String]
msggen = ErrorGen a -> Parsec a -> Parsec ()
forall a. ErrorGen a -> Parsec a -> Parsec ()
preventWith (ErrorGen a -> Parsec a -> Parsec ())
-> ErrorGen a -> Parsec a -> Parsec ()
forall a b. (a -> b) -> a -> b
$
  ErrorGen a
forall a. ErrorGen a
ErrorGen.specializedGen {
    ErrorGen.messages = msggen
  }

{-
@since 0.2.3.0
-}
preventativeExplain :: (a -> String) -> Parsec a -> Parsec ()
preventativeExplain :: forall a. (a -> String) -> Parsec a -> Parsec ()
preventativeExplain a -> String
reasongen = (a -> Maybe String) -> Parsec a -> Parsec ()
forall a. (a -> Maybe String) -> Parsec a -> Parsec ()
preventWithVanillaRaw (String -> Maybe String
forall a. a -> Maybe a
Just (String -> Maybe String) -> (a -> String) -> a -> Maybe String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> String
reasongen)