{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PostfixOperators #-}
{-# LANGUAGE Safe #-}
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
module Data.YAML.Token
( tokenize
, Token(..)
, Code(..)
, Encoding(..)
) where
import qualified Data.ByteString.Lazy.Char8 as BLC
import qualified Data.DList as D
import Prelude hiding ((*), (+), (-), (/), (^))
import qualified Prelude
import Data.YAML.Token.Encoding (Encoding (..), decode)
import Util hiding (empty)
import qualified Util
infixl 6 .+
(.+) :: Int -> Int -> Int
.+ :: Int -> Int -> Int
(.+) = Int -> Int -> Int
forall a. Num a => a -> a -> a
(Prelude.+)
infixl 6 .-
(.-) :: Int -> Int -> Int
.- :: Int -> Int -> Int
(.-) = Int -> Int -> Int
forall a. Num a => a -> a -> a
(Prelude.-)
infixl 8 ^.
(^.) :: record -> (record -> value) -> value
record :: record
record ^. :: record -> (record -> value) -> value
^. field :: record -> value
field = record -> value
field record
record
data Code = Bom
| Text
| Meta
| Break
| LineFeed
| LineFold
| Indicator
| White
| Indent
| DirectivesEnd
| DocumentEnd
| BeginEscape
| EndEscape
|
|
| BeginDirective
| EndDirective
| BeginTag
| EndTag
| BeginHandle
| EndHandle
| BeginAnchor
| EndAnchor
| BeginProperties
| EndProperties
| BeginAlias
| EndAlias
| BeginScalar
| EndScalar
| BeginSequence
| EndSequence
| BeginMapping
| EndMapping
| BeginPair
| EndPair
| BeginNode
| EndNode
| BeginDocument
| EndDocument
| BeginStream
| EndStream
| Error
| Unparsed
| Detected
deriving (Int -> Code -> ShowS
[Code] -> ShowS
Code -> String
(Int -> Code -> ShowS)
-> (Code -> String) -> ([Code] -> ShowS) -> Show Code
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Code] -> ShowS
$cshowList :: [Code] -> ShowS
show :: Code -> String
$cshow :: Code -> String
showsPrec :: Int -> Code -> ShowS
$cshowsPrec :: Int -> Code -> ShowS
Show,Code -> Code -> Bool
(Code -> Code -> Bool) -> (Code -> Code -> Bool) -> Eq Code
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Code -> Code -> Bool
$c/= :: Code -> Code -> Bool
== :: Code -> Code -> Bool
$c== :: Code -> Code -> Bool
Eq,(forall x. Code -> Rep Code x)
-> (forall x. Rep Code x -> Code) -> Generic Code
forall x. Rep Code x -> Code
forall x. Code -> Rep Code x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Code x -> Code
$cfrom :: forall x. Code -> Rep Code x
Generic)
instance NFData Code where
rnf :: Code -> ()
rnf x :: Code
x = Code -> () -> ()
forall a b. a -> b -> b
seq Code
x ()
data Token = Token {
Token -> Int
tByteOffset :: !Int,
Token -> Int
tCharOffset :: !Int,
Token -> Int
tLine :: !Int,
Token -> Int
tLineChar :: !Int,
Token -> Code
tCode :: !Code,
Token -> String
tText :: !String
} deriving (Int -> Token -> ShowS
[Token] -> ShowS
Token -> String
(Int -> Token -> ShowS)
-> (Token -> String) -> ([Token] -> ShowS) -> Show Token
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Token] -> ShowS
$cshowList :: [Token] -> ShowS
show :: Token -> String
$cshow :: Token -> String
showsPrec :: Int -> Token -> ShowS
$cshowsPrec :: Int -> Token -> ShowS
Show,(forall x. Token -> Rep Token x)
-> (forall x. Rep Token x -> Token) -> Generic Token
forall x. Rep Token x -> Token
forall x. Token -> Rep Token x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Token x -> Token
$cfrom :: forall x. Token -> Rep Token x
Generic)
instance NFData Token where
rnf :: Token -> ()
rnf Token { tText :: Token -> String
tText = String
txt } = String -> ()
forall a. NFData a => a -> ()
rnf String
txt
newtype Parser result = Parser (State -> Reply result)
applyParser :: Parser result -> State -> Reply result
applyParser :: Parser result -> State -> Reply result
applyParser (Parser p :: State -> Reply result
p) s :: State
s = State -> Reply result
p State
s
data Result result = Failed String
| Result result
| More (Parser result)
data Reply result = Reply {
Reply result -> Result result
rResult :: !(Result result),
Reply result -> DList Token
rTokens :: !(D.DList Token),
Reply result -> Maybe Decision
rCommit :: !(Maybe Decision),
Reply result -> State
rState :: !State
}
type Pattern = Parser ()
data State = State {
State -> Encoding
sEncoding :: !Encoding,
State -> Decision
sDecision :: !Decision,
State -> Int
sLimit :: !Int,
State -> Maybe Pattern
sForbidden :: !(Maybe Pattern),
State -> Bool
sIsPeek :: !Bool,
State -> Bool
sIsSol :: !Bool,
State -> String
sChars :: ![Char],
State -> Int
sCharsByteOffset :: !Int,
State -> Int
sCharsCharOffset :: !Int,
State -> Int
sCharsLine :: !Int,
State -> Int
sCharsLineChar :: !Int,
State -> Int
sByteOffset :: !Int,
State -> Int
sCharOffset :: !Int,
State -> Int
sLine :: !Int,
State -> Int
sLineChar :: !Int,
State -> Code
sCode :: !Code,
State -> Char
sLast :: !Char,
State -> [(Int, Char)]
sInput :: ![(Int, Char)]
}
initialState :: BLC.ByteString -> State
initialState :: ByteString -> State
initialState input :: ByteString
input
= $WState :: Encoding
-> Decision
-> Int
-> Maybe Pattern
-> Bool
-> Bool
-> String
-> Int
-> Int
-> Int
-> Int
-> Int
-> Int
-> Int
-> Int
-> Code
-> Char
-> [(Int, Char)]
-> State
State { sEncoding :: Encoding
sEncoding = Encoding
encoding
, sDecision :: Decision
sDecision = Decision
DeNone
, sLimit :: Int
sLimit = -1
, sForbidden :: Maybe Pattern
sForbidden = Maybe Pattern
forall a. Maybe a
Nothing
, sIsPeek :: Bool
sIsPeek = Bool
False
, sIsSol :: Bool
sIsSol = Bool
True
, sChars :: String
sChars = []
, sCharsByteOffset :: Int
sCharsByteOffset = -1
, sCharsCharOffset :: Int
sCharsCharOffset = -1
, sCharsLine :: Int
sCharsLine = -1
, sCharsLineChar :: Int
sCharsLineChar = -1
, sByteOffset :: Int
sByteOffset = 0
, sCharOffset :: Int
sCharOffset = 0
, sLine :: Int
sLine = 1
, sLineChar :: Int
sLineChar = 0
, sCode :: Code
sCode = Code
Unparsed
, sLast :: Char
sLast = ' '
, sInput :: [(Int, Char)]
sInput = [(Int, Char)]
decoded
}
where
(encoding :: Encoding
encoding, decoded :: [(Int, Char)]
decoded) = ByteString -> (Encoding, [(Int, Char)])
decode ByteString
input
setLimit :: Int -> State -> State
setLimit :: Int -> State -> State
setLimit limit :: Int
limit state :: State
state = State
state { sLimit :: Int
sLimit = Int
limit }
{-# INLINE setLimit #-}
setForbidden :: Maybe Pattern -> State -> State
setForbidden :: Maybe Pattern -> State -> State
setForbidden forbidden :: Maybe Pattern
forbidden state :: State
state = State
state { sForbidden :: Maybe Pattern
sForbidden = Maybe Pattern
forbidden }
{-# INLINE setForbidden #-}
setCode :: Code -> State -> State
setCode :: Code -> State -> State
setCode code :: Code
code state :: State
state = State
state { sCode :: Code
sCode = Code
code }
{-# INLINE setCode #-}
class Match parameter result | parameter -> result where
match :: parameter -> Parser result
instance Match (Parser result) result where
match :: Parser result -> Parser result
match = Parser result -> Parser result
forall a. a -> a
id
instance Match Char () where
match :: Char -> Pattern
match code :: Char
code = (Char -> Bool) -> Pattern
nextIf (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
code)
instance Match (Char, Char) () where
match :: (Char, Char) -> Pattern
match (low :: Char
low, high :: Char
high) = (Char -> Bool) -> Pattern
nextIf ((Char -> Bool) -> Pattern) -> (Char -> Bool) -> Pattern
forall a b. (a -> b) -> a -> b
$ \ code :: Char
code -> Char
low Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
code Bool -> Bool -> Bool
&& Char
code Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
<= Char
high
instance Match String () where
match :: String -> Pattern
match = (Char -> Pattern -> Pattern) -> Pattern -> String -> Pattern
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Char -> Pattern -> Pattern
forall match1 result1 match2 result2.
(Match match1 result1, Match match2 result2) =>
match1 -> match2 -> Parser result2
(&) Pattern
empty
returnReply :: State -> result -> Reply result
returnReply :: State -> result -> Reply result
returnReply state :: State
state result :: result
result = $WReply :: forall result.
Result result
-> DList Token -> Maybe Decision -> State -> Reply result
Reply { rResult :: Result result
rResult = result -> Result result
forall result. result -> Result result
Result result
result,
rTokens :: DList Token
rTokens = DList Token
forall a. DList a
D.empty,
rCommit :: Maybe Decision
rCommit = Maybe Decision
forall a. Maybe a
Nothing,
rState :: State
rState = State
state }
tokenReply :: State -> Token -> Reply ()
tokenReply :: State -> Token -> Reply ()
tokenReply state :: State
state token :: Token
token = $WReply :: forall result.
Result result
-> DList Token -> Maybe Decision -> State -> Reply result
Reply { rResult :: Result ()
rResult = () -> Result ()
forall result. result -> Result result
Result (),
rTokens :: DList Token
rTokens = Token -> DList Token
forall a. a -> DList a
D.singleton Token
token,
rCommit :: Maybe Decision
rCommit = Maybe Decision
forall a. Maybe a
Nothing,
rState :: State
rState = State
state { sCharsByteOffset :: Int
sCharsByteOffset = -1,
sCharsCharOffset :: Int
sCharsCharOffset = -1,
sCharsLine :: Int
sCharsLine = -1,
sCharsLineChar :: Int
sCharsLineChar = -1,
sChars :: String
sChars = [] } }
failReply :: State -> String -> Reply result
failReply :: State -> String -> Reply result
failReply state :: State
state message :: String
message = $WReply :: forall result.
Result result
-> DList Token -> Maybe Decision -> State -> Reply result
Reply { rResult :: Result result
rResult = String -> Result result
forall result. String -> Result result
Failed String
message,
rTokens :: DList Token
rTokens = DList Token
forall a. DList a
D.empty,
rCommit :: Maybe Decision
rCommit = Maybe Decision
forall a. Maybe a
Nothing,
rState :: State
rState = State
state }
unexpectedReply :: State -> Reply result
unexpectedReply :: State -> Reply result
unexpectedReply state :: State
state = case State
stateState -> (State -> [(Int, Char)]) -> [(Int, Char)]
forall record value. record -> (record -> value) -> value
^.State -> [(Int, Char)]
sInput of
((_, char :: Char
char):_) -> State -> String -> Reply result
forall result. State -> String -> Reply result
failReply State
state (String -> Reply result) -> String -> Reply result
forall a b. (a -> b) -> a -> b
$ "Unexpected '" String -> ShowS
forall a. [a] -> [a] -> [a]
++ [Char
char] String -> ShowS
forall a. [a] -> [a] -> [a]
++ "'"
[] -> State -> String -> Reply result
forall result. State -> String -> Reply result
failReply State
state "Unexpected end of input"
instance Functor Parser where
fmap :: (a -> b) -> Parser a -> Parser b
fmap g :: a -> b
g f :: Parser a
f = (State -> Reply b) -> Parser b
forall result. (State -> Reply result) -> Parser result
Parser ((State -> Reply b) -> Parser b) -> (State -> Reply b) -> Parser b
forall a b. (a -> b) -> a -> b
$ \state :: State
state ->
let reply :: Reply a
reply = Parser a -> State -> Reply a
forall result. Parser result -> State -> Reply result
applyParser Parser a
f State
state
in case Reply a
replyReply a -> (Reply a -> Result a) -> Result a
forall record value. record -> (record -> value) -> value
^.Reply a -> Result a
forall result. Reply result -> Result result
rResult of
Failed message :: String
message -> Reply a
reply { rResult :: Result b
rResult = String -> Result b
forall result. String -> Result result
Failed String
message }
Result x :: a
x -> Reply a
reply { rResult :: Result b
rResult = b -> Result b
forall result. result -> Result result
Result (a -> b
g a
x) }
More parser :: Parser a
parser -> Reply a
reply { rResult :: Result b
rResult = Parser b -> Result b
forall result. Parser result -> Result result
More (Parser b -> Result b) -> Parser b -> Result b
forall a b. (a -> b) -> a -> b
$ (a -> b) -> Parser a -> Parser b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
g Parser a
parser }
instance Applicative Parser where
pure :: a -> Parser a
pure result :: a
result = (State -> Reply a) -> Parser a
forall result. (State -> Reply result) -> Parser result
Parser ((State -> Reply a) -> Parser a) -> (State -> Reply a) -> Parser a
forall a b. (a -> b) -> a -> b
$ \state :: State
state -> State -> a -> Reply a
forall result. State -> result -> Reply result
returnReply State
state a
result
<*> :: Parser (a -> b) -> Parser a -> Parser b
(<*>) = Parser (a -> b) -> Parser a -> Parser b
forall (m :: * -> *) a b. Monad m => m (a -> b) -> m a -> m b
ap
left :: Parser a
left *> :: Parser a -> Parser b -> Parser b
*> right :: Parser b
right = (State -> Reply b) -> Parser b
forall result. (State -> Reply result) -> Parser result
Parser ((State -> Reply b) -> Parser b) -> (State -> Reply b) -> Parser b
forall a b. (a -> b) -> a -> b
$ \state :: State
state ->
let reply :: Reply a
reply = Parser a -> State -> Reply a
forall result. Parser result -> State -> Reply result
applyParser Parser a
left State
state
in case Reply a
replyReply a -> (Reply a -> Result a) -> Result a
forall record value. record -> (record -> value) -> value
^.Reply a -> Result a
forall result. Reply result -> Result result
rResult of
Failed message :: String
message -> Reply a
reply { rResult :: Result b
rResult = String -> Result b
forall result. String -> Result result
Failed String
message }
Result _ -> Reply a
reply { rResult :: Result b
rResult = Parser b -> Result b
forall result. Parser result -> Result result
More Parser b
right }
More parser :: Parser a
parser -> Reply a
reply { rResult :: Result b
rResult = Parser b -> Result b
forall result. Parser result -> Result result
More (Parser b -> Result b) -> Parser b -> Result b
forall a b. (a -> b) -> a -> b
$ Parser a
parser Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Parser b
right }
instance Monad Parser where
return :: a -> Parser a
return = a -> Parser a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
left :: Parser a
left >>= :: Parser a -> (a -> Parser b) -> Parser b
>>= right :: a -> Parser b
right = (State -> Reply b) -> Parser b
forall result. (State -> Reply result) -> Parser result
Parser ((State -> Reply b) -> Parser b) -> (State -> Reply b) -> Parser b
forall a b. (a -> b) -> a -> b
$ \state :: State
state ->
let reply :: Reply a
reply = Parser a -> State -> Reply a
forall result. Parser result -> State -> Reply result
applyParser Parser a
left State
state
in case Reply a
replyReply a -> (Reply a -> Result a) -> Result a
forall record value. record -> (record -> value) -> value
^.Reply a -> Result a
forall result. Reply result -> Result result
rResult of
Failed message :: String
message -> Reply a
reply { rResult :: Result b
rResult = String -> Result b
forall result. String -> Result result
Failed String
message }
Result value :: a
value -> Reply a
reply { rResult :: Result b
rResult = Parser b -> Result b
forall result. Parser result -> Result result
More (Parser b -> Result b) -> Parser b -> Result b
forall a b. (a -> b) -> a -> b
$ a -> Parser b
right a
value }
More parser :: Parser a
parser -> Reply a
reply { rResult :: Result b
rResult = Parser b -> Result b
forall result. Parser result -> Result result
More (Parser b -> Result b) -> Parser b -> Result b
forall a b. (a -> b) -> a -> b
$ Parser a
parser Parser a -> (a -> Parser b) -> Parser b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= a -> Parser b
right }
>> :: Parser a -> Parser b -> Parser b
(>>) = Parser a -> Parser b -> Parser b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
(*>)
pfail :: String -> Parser a
pfail :: String -> Parser a
pfail message :: String
message = (State -> Reply a) -> Parser a
forall result. (State -> Reply result) -> Parser result
Parser ((State -> Reply a) -> Parser a) -> (State -> Reply a) -> Parser a
forall a b. (a -> b) -> a -> b
$ \state :: State
state -> State -> String -> Reply a
forall result. State -> String -> Reply result
failReply State
state String
message
infix 3 ^
infix 3 %
infix 3 <%
infix 3 !
infix 3 ?!
infixl 3 -
infixr 2 &
infixr 1 /
infix 0 ?
infix 0 *
infix 0 +
infix 0 <?
infix 0 >?
infix 0 >!
(%) :: (Match match result) => match -> Int -> Pattern
parser :: match
parser % :: match -> Int -> Pattern
% n :: Int
n
| Int
n Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= 0 = Pattern
empty
| Bool
otherwise = Parser result
parser' Parser result -> Pattern -> Pattern
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (Parser result
parser' Parser result -> Int -> Pattern
forall match result. Match match result => match -> Int -> Pattern
% Int
n Int -> Int -> Int
.- 1)
where
parser' :: Parser result
parser' = match -> Parser result
forall parameter result.
Match parameter result =>
parameter -> Parser result
match match
parser
(<%) :: (Match match result) => match -> Int -> Pattern
parser :: match
parser <% :: match -> Int -> Pattern
<% n :: Int
n = case Int
n Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` 1 of
LT -> String -> Pattern
forall a. String -> Parser a
pfail "Fewer than 0 repetitions"
EQ -> match -> Maybe String -> Pattern
forall match result.
Match match result =>
match -> Maybe String -> Pattern
reject match
parser Maybe String
forall a. Maybe a
Nothing
GT -> Decision
DeLess Decision -> Pattern -> Pattern
forall match result.
Match match result =>
Decision -> match -> Parser result
^ ( ((match
parser match -> Decision -> Pattern
forall match result.
Match match result =>
match -> Decision -> Pattern
! Decision
DeLess) Pattern -> Pattern -> Pattern
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (match
parser match -> Int -> Pattern
forall match result. Match match result => match -> Int -> Pattern
<% Int
n Int -> Int -> Int
.- 1)) Pattern -> Pattern -> Pattern
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pattern
empty )
data Decision = DeNone
| DeStar
| DeLess
| DeDirective
| DeDoc
| DeEscape
| DeEscaped
| DeFold
| DeKey
|
| DeMore
| DeNode
| DePair
deriving (Int -> Decision -> ShowS
[Decision] -> ShowS
Decision -> String
(Int -> Decision -> ShowS)
-> (Decision -> String) -> ([Decision] -> ShowS) -> Show Decision
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Decision] -> ShowS
$cshowList :: [Decision] -> ShowS
show :: Decision -> String
$cshow :: Decision -> String
showsPrec :: Int -> Decision -> ShowS
$cshowsPrec :: Int -> Decision -> ShowS
Show,Decision -> Decision -> Bool
(Decision -> Decision -> Bool)
-> (Decision -> Decision -> Bool) -> Eq Decision
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Decision -> Decision -> Bool
$c/= :: Decision -> Decision -> Bool
== :: Decision -> Decision -> Bool
$c== :: Decision -> Decision -> Bool
Eq)
(^) :: (Match match result) => Decision -> match -> Parser result
decision :: Decision
decision ^ :: Decision -> match -> Parser result
^ parser :: match
parser = Decision -> Parser result -> Parser result
forall result. Decision -> Parser result -> Parser result
choice Decision
decision (Parser result -> Parser result) -> Parser result -> Parser result
forall a b. (a -> b) -> a -> b
$ match -> Parser result
forall parameter result.
Match parameter result =>
parameter -> Parser result
match match
parser
(!) :: (Match match result) => match -> Decision -> Pattern
parser :: match
parser ! :: match -> Decision -> Pattern
! decision :: Decision
decision = match -> Parser result
forall parameter result.
Match parameter result =>
parameter -> Parser result
match match
parser Parser result -> Pattern -> Pattern
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Decision -> Pattern
commit Decision
decision
(?!) :: (Match match result) => match -> Decision -> Pattern
parser :: match
parser ?! :: match -> Decision -> Pattern
?! decision :: Decision
decision = match -> Parser result
forall parameter result.
Match parameter result =>
parameter -> Parser result
peek match
parser Parser result -> Pattern -> Pattern
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Decision -> Pattern
commit Decision
decision
(<?) :: (Match match result) => match -> Parser result
<? :: match -> Parser result
(<?) lookbehind :: match
lookbehind = match -> Parser result
forall parameter result.
Match parameter result =>
parameter -> Parser result
prev match
lookbehind
(>?) :: (Match match result) => match -> Parser result
>? :: match -> Parser result
(>?) lookahead :: match
lookahead = match -> Parser result
forall parameter result.
Match parameter result =>
parameter -> Parser result
peek match
lookahead
(>!) :: (Match match result) => match -> Pattern
>! :: match -> Pattern
(>!) lookahead :: match
lookahead = match -> Maybe String -> Pattern
forall match result.
Match match result =>
match -> Maybe String -> Pattern
reject match
lookahead Maybe String
forall a. Maybe a
Nothing
(-) :: (Match match1 result1, Match match2 result2) => match1 -> match2 -> Parser result1
parser :: match1
parser - :: match1 -> match2 -> Parser result1
- rejected :: match2
rejected = match2 -> Maybe String -> Pattern
forall match result.
Match match result =>
match -> Maybe String -> Pattern
reject match2
rejected Maybe String
forall a. Maybe a
Nothing Pattern -> Parser result1 -> Parser result1
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> match1 -> Parser result1
forall parameter result.
Match parameter result =>
parameter -> Parser result
match match1
parser
(&) :: (Match match1 result1, Match match2 result2) => match1 -> match2 -> Parser result2
before :: match1
before & :: match1 -> match2 -> Parser result2
& after :: match2
after = match1 -> Parser result1
forall parameter result.
Match parameter result =>
parameter -> Parser result
match match1
before Parser result1 -> Parser result2 -> Parser result2
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> match2 -> Parser result2
forall parameter result.
Match parameter result =>
parameter -> Parser result
match match2
after
(/) :: (Match match1 result, Match match2 result) => match1 -> match2 -> Parser result
first :: match1
first / :: match1 -> match2 -> Parser result
/ second :: match2
second = (State -> Reply result) -> Parser result
forall result. (State -> Reply result) -> Parser result
Parser ((State -> Reply result) -> Parser result)
-> (State -> Reply result) -> Parser result
forall a b. (a -> b) -> a -> b
$ Parser result -> State -> Reply result
forall result. Parser result -> State -> Reply result
applyParser (match1 -> Parser result
forall parameter result.
Match parameter result =>
parameter -> Parser result
match match1
first Parser result -> Parser result -> Parser result
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> match2 -> Parser result
forall parameter result.
Match parameter result =>
parameter -> Parser result
match match2
second)
(?) :: (Match match result) => match -> Pattern
? :: match -> Pattern
(?) optional :: match
optional = (match -> Parser result
forall parameter result.
Match parameter result =>
parameter -> Parser result
match match
optional Parser result -> Pattern -> Pattern
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Pattern
empty) Pattern -> Pattern -> Pattern
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pattern
empty
(*) :: (Match match result) => match -> Pattern
* :: match -> Pattern
(*) parser :: match
parser = Decision
DeStar Decision -> Pattern -> Pattern
forall match result.
Match match result =>
Decision -> match -> Parser result
^ Pattern
zomParser
where
zomParser :: Pattern
zomParser = ((match
parser match -> Decision -> Pattern
forall match result.
Match match result =>
match -> Decision -> Pattern
! Decision
DeStar) Pattern -> Pattern -> Pattern
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Pattern -> Pattern
forall parameter result.
Match parameter result =>
parameter -> Parser result
match Pattern
zomParser) Pattern -> Pattern -> Pattern
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pattern
empty
(+) :: (Match match result) => match -> Pattern
+ :: match -> Pattern
(+) parser :: match
parser = match -> Parser result
forall parameter result.
Match parameter result =>
parameter -> Parser result
match match
parser Parser result -> Pattern -> Pattern
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> (match
parser match -> Pattern
forall match result. Match match result => match -> Pattern
*)
instance Alternative Parser where
empty :: Parser a
empty = String -> Parser a
forall a. String -> Parser a
pfail "empty"
left :: Parser a
left <|> :: Parser a -> Parser a -> Parser a
<|> right :: Parser a
right = (State -> Reply a) -> Parser a
forall result. (State -> Reply result) -> Parser result
Parser ((State -> Reply a) -> Parser a) -> (State -> Reply a) -> Parser a
forall a b. (a -> b) -> a -> b
$ \state :: State
state -> State -> DList Token -> Parser a -> Parser a -> State -> Reply a
forall result.
State
-> DList Token
-> Parser result
-> Parser result
-> State
-> Reply result
decideParser State
state DList Token
forall a. DList a
D.empty Parser a
left Parser a
right State
state
where
decideParser :: State
-> DList Token
-> Parser result
-> Parser result
-> State
-> Reply result
decideParser point :: State
point tokens :: DList Token
tokens left :: Parser result
left right :: Parser result
right state :: State
state =
let reply :: Reply result
reply = Parser result -> State -> Reply result
forall result. Parser result -> State -> Reply result
applyParser Parser result
left State
state
tokens' :: DList Token
tokens' = DList Token -> DList Token -> DList Token
forall a. DList a -> DList a -> DList a
D.append DList Token
tokens (DList Token -> DList Token) -> DList Token -> DList Token
forall a b. (a -> b) -> a -> b
$ Reply result
replyReply result -> (Reply result -> DList Token) -> DList Token
forall record value. record -> (record -> value) -> value
^.Reply result -> DList Token
forall result. Reply result -> DList Token
rTokens
in case (Reply result
replyReply result -> (Reply result -> Result result) -> Result result
forall record value. record -> (record -> value) -> value
^.Reply result -> Result result
forall result. Reply result -> Result result
rResult, Reply result
replyReply result -> (Reply result -> Maybe Decision) -> Maybe Decision
forall record value. record -> (record -> value) -> value
^.Reply result -> Maybe Decision
forall result. Reply result -> Maybe Decision
rCommit) of
(Failed _, _) -> $WReply :: forall result.
Result result
-> DList Token -> Maybe Decision -> State -> Reply result
Reply { rState :: State
rState = State
point,
rTokens :: DList Token
rTokens = DList Token
forall a. DList a
D.empty,
rResult :: Result result
rResult = Parser result -> Result result
forall result. Parser result -> Result result
More Parser result
right,
rCommit :: Maybe Decision
rCommit = Maybe Decision
forall a. Maybe a
Nothing }
(Result _, _) -> Reply result
reply { rTokens :: DList Token
rTokens = DList Token
tokens' }
(More _, Just _) -> Reply result
reply { rTokens :: DList Token
rTokens = DList Token
tokens' }
(More left' :: Parser result
left', Nothing) -> State
-> DList Token
-> Parser result
-> Parser result
-> State
-> Reply result
decideParser State
point DList Token
tokens' Parser result
left' Parser result
right (Reply result
replyReply result -> (Reply result -> State) -> State
forall record value. record -> (record -> value) -> value
^.Reply result -> State
forall result. Reply result -> State
rState)
choice :: Decision -> Parser result -> Parser result
choice :: Decision -> Parser result -> Parser result
choice decision :: Decision
decision parser :: Parser result
parser = (State -> Reply result) -> Parser result
forall result. (State -> Reply result) -> Parser result
Parser ((State -> Reply result) -> Parser result)
-> (State -> Reply result) -> Parser result
forall a b. (a -> b) -> a -> b
$ \ state :: State
state ->
Parser result -> State -> Reply result
forall result. Parser result -> State -> Reply result
applyParser (Decision -> Decision -> Parser result -> Parser result
forall result.
Decision -> Decision -> Parser result -> Parser result
choiceParser (State
stateState -> (State -> Decision) -> Decision
forall record value. record -> (record -> value) -> value
^.State -> Decision
sDecision) Decision
decision Parser result
parser) State
state { sDecision :: Decision
sDecision = Decision
decision }
where choiceParser :: Decision -> Decision -> Parser result -> Parser result
choiceParser parentDecision :: Decision
parentDecision makingDecision :: Decision
makingDecision parser :: Parser result
parser = (State -> Reply result) -> Parser result
forall result. (State -> Reply result) -> Parser result
Parser ((State -> Reply result) -> Parser result)
-> (State -> Reply result) -> Parser result
forall a b. (a -> b) -> a -> b
$ \ state :: State
state ->
let reply :: Reply result
reply = Parser result -> State -> Reply result
forall result. Parser result -> State -> Reply result
applyParser Parser result
parser State
state
commit' :: Maybe Decision
commit' = case Reply result
replyReply result -> (Reply result -> Maybe Decision) -> Maybe Decision
forall record value. record -> (record -> value) -> value
^.Reply result -> Maybe Decision
forall result. Reply result -> Maybe Decision
rCommit of
Nothing -> Maybe Decision
forall a. Maybe a
Nothing
Just decision :: Decision
decision | Decision
decision Decision -> Decision -> Bool
forall a. Eq a => a -> a -> Bool
== Decision
makingDecision -> Maybe Decision
forall a. Maybe a
Nothing
| Bool
otherwise -> Reply result
replyReply result -> (Reply result -> Maybe Decision) -> Maybe Decision
forall record value. record -> (record -> value) -> value
^.Reply result -> Maybe Decision
forall result. Reply result -> Maybe Decision
rCommit
reply' :: Reply result
reply' = case Reply result
replyReply result -> (Reply result -> Result result) -> Result result
forall record value. record -> (record -> value) -> value
^.Reply result -> Result result
forall result. Reply result -> Result result
rResult of
More parser' :: Parser result
parser' -> Reply result
reply { rCommit :: Maybe Decision
rCommit = Maybe Decision
commit',
rResult :: Result result
rResult = Parser result -> Result result
forall result. Parser result -> Result result
More (Parser result -> Result result) -> Parser result -> Result result
forall a b. (a -> b) -> a -> b
$ Decision -> Decision -> Parser result -> Parser result
choiceParser Decision
parentDecision Decision
makingDecision Parser result
parser' }
_ -> Reply result
reply { rCommit :: Maybe Decision
rCommit = Maybe Decision
commit',
rState :: State
rState = (Reply result
replyReply result -> (Reply result -> State) -> State
forall record value. record -> (record -> value) -> value
^.Reply result -> State
forall result. Reply result -> State
rState) { sDecision :: Decision
sDecision = Decision
parentDecision } }
in Reply result
reply'
recovery :: (Match match1 result) => match1 -> Parser result -> Parser result
recovery :: match1 -> Parser result -> Parser result
recovery pattern :: match1
pattern recover :: Parser result
recover =
(State -> Reply result) -> Parser result
forall result. (State -> Reply result) -> Par