rollback
and until
This commit is contained in:
parent
6708b2169a
commit
540b1c1962
@ -6,4 +6,4 @@ module GenericParser
|
|||||||
|
|
||||||
import GenericParser.DomainParser.Common (DomainError(..), ldh_str, let_dig, let_dig_hyp, max_domain_length, max_label_length, Size)
|
import GenericParser.DomainParser.Common (DomainError(..), ldh_str, let_dig, let_dig_hyp, max_domain_length, max_label_length, Size)
|
||||||
import GenericParser.DomainParser (domain, label, subdomain, sub_eof)
|
import GenericParser.DomainParser (domain, label, subdomain, sub_eof)
|
||||||
import GenericParser.Parser (alphanum, char, current_input, current_position, digit, eof, Error, failure, failureError, ident, identifier, Input, int, integer, item, letter, lower, many1, nat, natural, parse, parse_last_char, Parser(..), Position, PositionString, Result, sat, space, string, success, symbol, token, try, tryMaybe, upper, Value)
|
import GenericParser.Parser (alphanum, char, current_input, current_position, digit, eof, Error, failure, failureError, ident, identifier, Input, int, integer, item, letter, lower, many1, nat, natural, parse, parse_last_char, Parser(..), Position, PositionString, Result, rollback, sat, space, string, success, symbol, token, try, tryMaybe, until, upper, Value)
|
||||||
|
@ -6,8 +6,6 @@ import Prelude (bind, not, pure, ($), (&&), (*>), (<<<), (<>), (>), (-))
|
|||||||
|
|
||||||
import Control.Alt ((<|>))
|
import Control.Alt ((<|>))
|
||||||
import Control.Lazy (defer)
|
import Control.Lazy (defer)
|
||||||
import Data.Array as A
|
|
||||||
import Data.Either (Either(..))
|
|
||||||
import Data.Maybe (Maybe(..), maybe)
|
import Data.Maybe (Maybe(..), maybe)
|
||||||
import Data.String as S
|
import Data.String as S
|
||||||
import Data.String.CodeUnits as CU
|
import Data.String.CodeUnits as CU
|
||||||
|
@ -31,7 +31,7 @@ email :: Parser EmailError String
|
|||||||
email = do login <- login_part
|
email = do login <- login_part
|
||||||
_ <- char '@'
|
_ <- char '@'
|
||||||
input <- current_input
|
input <- current_input
|
||||||
case parse sub_eof { string: input.string, position: input.position } of
|
case parse sub_eof input of
|
||||||
Left {error, position} ->
|
Left {error, position} ->
|
||||||
Parser \_ -> failureError position (Just $ InvalidDomain error)
|
Parser \_ -> failureError position (Just $ InvalidDomain error)
|
||||||
Right {result} -> pure $ login <> "@" <> result
|
Right {result} -> pure $ login <> "@" <> result
|
||||||
|
@ -3,12 +3,12 @@ import Prelude
|
|||||||
|
|
||||||
import Control.Alt (class Alt, (<|>))
|
import Control.Alt (class Alt, (<|>))
|
||||||
import Control.Alternative (class Alternative)
|
import Control.Alternative (class Alternative)
|
||||||
import Control.Lazy (class Lazy)
|
import Control.Lazy (class Lazy, defer)
|
||||||
import Control.Plus (class Plus, empty)
|
import Control.Plus (class Plus, empty)
|
||||||
import Data.Array as A
|
import Data.Array as A
|
||||||
import Data.Either (Either(..))
|
import Data.Either (Either(..))
|
||||||
import Data.Int as Int
|
import Data.Int as Int
|
||||||
import Data.Maybe (Maybe(..))
|
import Data.Maybe (Maybe(..), maybe)
|
||||||
import Data.String as S
|
import Data.String as S
|
||||||
import Data.String.CodeUnits (toCharArray, fromCharArray, singleton)
|
import Data.String.CodeUnits (toCharArray, fromCharArray, singleton)
|
||||||
|
|
||||||
@ -42,6 +42,12 @@ current_position = Parser \input -> success input input.position
|
|||||||
current_input :: forall e. Parser e Input
|
current_input :: forall e. Parser e Input
|
||||||
current_input = Parser \input -> success input input
|
current_input = Parser \input -> success input input
|
||||||
|
|
||||||
|
-- | `rollback` replaces the current input.
|
||||||
|
-- |
|
||||||
|
-- | This function cannot fail since no parsing is performed.
|
||||||
|
rollback :: forall e. Input -> Parser e Unit
|
||||||
|
rollback newinput = Parser \_ -> success newinput unit
|
||||||
|
|
||||||
-- | Fail with a specified error.
|
-- | Fail with a specified error.
|
||||||
-- | When a parsing has a specified error, no alternative will be tried and the error is reported.
|
-- | When a parsing has a specified error, no alternative will be tried and the error is reported.
|
||||||
failureError :: forall e v. Position -> Maybe e -> Result e v
|
failureError :: forall e v. Position -> Maybe e -> Result e v
|
||||||
@ -212,6 +218,17 @@ many1 p = do first <- p
|
|||||||
rest <- A.many p
|
rest <- A.many p
|
||||||
pure $ A.cons first rest
|
pure $ A.cons first rest
|
||||||
|
|
||||||
|
-- | TODO: `until`
|
||||||
|
until :: forall e v. Parser e v -> Parser e v -> Parser e (Array v)
|
||||||
|
until parser_end p = do
|
||||||
|
input <- current_input
|
||||||
|
case parse parser_end input of
|
||||||
|
Left _ -> do v <- p
|
||||||
|
mayberest <- tryMaybe $ defer \_ -> until parser_end p
|
||||||
|
pure $ [v] <> maybe [] id mayberest
|
||||||
|
Right _ -> Parser \_ -> failure input.position
|
||||||
|
where id x = x
|
||||||
|
|
||||||
-- | Parse the last character of a String.
|
-- | Parse the last character of a String.
|
||||||
-- | Return false in case the string is empty.
|
-- | Return false in case the string is empty.
|
||||||
parse_last_char :: forall e. String -> Parser e Char -> Boolean
|
parse_last_char :: forall e. String -> Parser e Char -> Boolean
|
||||||
|
Loading…
Reference in New Issue
Block a user