5
5
6
6
module Test.Main where
7
7
8
- import Prelude ( class Eq , class Show , Unit , append , bind , const , discard , div , flip , identity , map , negate , pure , show , unit , void , ($), ($>), (*), (*>), (+), (-), (/), (/=), (<$), (<$>), (<*), (<*>), (<>), (==), (>>=) )
8
+ import Prelude hiding ( between , when )
9
9
10
10
import Control.Alt ((<|>))
11
11
import Control.Lazy (fix , defer )
12
+ import Control.Monad.Rec.Class (Step (..), tailRecM )
12
13
import Control.Monad.State (State , lift , modify , runState )
13
14
import Data.Array (some , toUnfoldable )
14
15
import Data.Array as Array
15
16
import Data.Bifunctor (lmap , rmap )
16
17
import Data.CodePoint.Unicode as CodePoint.Unicode
17
18
import Data.Either (Either (..), either , fromLeft , hush )
18
19
import Data.Foldable (oneOf )
20
+ import Data.Function.Uncurried (mkFn5 , runFn2 )
19
21
import Data.List (List (..), fromFoldable , (:))
20
22
import Data.List as List
21
23
import Data.List.NonEmpty (NonEmptyList (..), catMaybes , cons , cons' )
@@ -35,7 +37,7 @@ import Effect (Effect)
35
37
import Effect.Console (log , logShow )
36
38
import Effect.Unsafe (unsafePerformEffect )
37
39
import Node.Process (lookupEnv )
38
- import Parsing (ParseError (..), ParseState (..), Parser , ParserT , Position (..), consume , fail , getParserT , initialPos , parseErrorPosition , position , region , runParser )
40
+ import Parsing (ParseError (..), ParseState (..), Parser , ParserT (..) , Position (..), consume , fail , getParserT , initialPos , parseErrorPosition , position , region , runParser )
39
41
import Parsing.Combinators (advance , between , chainl , chainl1 , chainr , chainr1 , choice , empty , endBy , endBy1 , lookAhead , many , many1 , many1Till , many1Till_ , manyIndex , manyTill , manyTill_ , notFollowedBy , optional , optionMaybe , replicateA , sepBy , sepBy1 , sepEndBy , sepEndBy1 , skipMany , skipMany1 , try , tryRethrow , (<?>), (<??>), (<~?>))
40
42
import Parsing.Combinators.Array as Combinators.Array
41
43
import Parsing.Expr (Assoc (..), Operator (..), buildExprParser )
@@ -49,7 +51,7 @@ import Parsing.Token as Token
49
51
import Partial.Unsafe (unsafePartial )
50
52
import Test.Assert (assert' , assertEqual' )
51
53
import Test.IndentationTests as IndentationTests
52
- import Test.Lib
54
+ import Test.Lib ( class ParseErrorHuman__OnlyString , TestM , mkParseErrorTestMessage , mkParseErrorTestPosition , mkParseTest )
53
55
54
56
parseTest :: forall s a . Show a => Eq a => ParseErrorHuman__OnlyString s => s -> a -> Parser s a -> Effect Unit
55
57
parseTest = mkParseTest runParser
@@ -60,6 +62,13 @@ parseErrorTestPosition = mkParseErrorTestPosition runParser
60
62
parseErrorTestMessage :: forall s a . Show a => Parser s a -> s -> String -> Effect Unit
61
63
parseErrorTestMessage = mkParseErrorTestMessage runParser
62
64
65
+ parseState :: forall m s a . (ParseState s -> Tuple (ParseState s ) a ) -> ParserT s m a
66
+ parseState k = ParserT
67
+ ( mkFn5 \state1 _ _ _ done -> do
68
+ let Tuple state2 res = k state1
69
+ runFn2 done state2 res
70
+ )
71
+
63
72
parens :: forall m a . ParserT String m a -> ParserT String m a
64
73
parens = between (string " (" ) (string " )" )
65
74
@@ -581,8 +590,44 @@ takeWhilePropagateFail = do
581
590
" f"
582
591
(Position { index: 1 , line: 1 , column: 2 })
583
592
593
+ applicativeSemantics :: Parser String String
594
+ applicativeSemantics =
595
+ ( string " foo"
596
+ <* parseState (\(ParseState a b _) -> Tuple (ParseState a b false ) unit)
597
+ <* fail " fail"
598
+ )
599
+ <|> pure " "
600
+
601
+ bindSemantics :: Parser String String
602
+ bindSemantics =
603
+ ( do
604
+ _ <- string " foo"
605
+ parseState (\(ParseState a b _) -> Tuple (ParseState a b false ) unit)
606
+ fail " fail"
607
+ )
608
+ <|> pure " "
609
+
610
+ monadRecSemantics :: Parser String String
611
+ monadRecSemantics = loop <|> pure " "
612
+ where
613
+ loop = tailRecM
614
+ ( case _ of
615
+ 1 -> do
616
+ _ <- string " foo"
617
+ pure (Loop 2 )
618
+ 2 ->
619
+ parseState (\(ParseState a b _) -> Tuple (ParseState a b false ) (Loop 3 ))
620
+ _ ->
621
+ fail " fail"
622
+ )
623
+ 1
624
+
584
625
main :: Effect Unit
585
626
main = do
627
+ log " \n TESTS Semantics\n "
628
+ parseErrorTestMessage applicativeSemantics " foo" " fail"
629
+ parseErrorTestMessage bindSemantics " foo" " fail"
630
+ parseErrorTestMessage monadRecSemantics " foo" " fail"
586
631
587
632
log " \n TESTS Indentation\n "
588
633
IndentationTests .testIndentationParser
0 commit comments