1 {-# LANGUAGE FlexibleContexts #-}
2 {-# LANGUAGE FlexibleInstances #-}
4 {-# LANGUAGE NoMonomorphismRestriction #-}
5 {-# LANGUAGE ScopedTypeVariables #-}
6 {-# LANGUAGE TypeOperators #-}
7 {-# OPTIONS_GHC -fno-warn-missing-signatures #-}
9 module Expr.Monad.Test where
12 import Test.Tasty.HUnit
14 import qualified Control.Arrow as Arrow
15 import qualified Control.Monad as Monad
16 import qualified Data.Functor as Functor
17 import Data.Proxy (Proxy(..))
18 import Data.Text (Text)
19 import Data.Type.Equality ((:~:)(Refl))
20 import Prelude hiding ((&&), not, (||), (==), (<$>), (+), Applicative(..), Monad(..), Monad(..))
22 import Language.Symantic.Type
23 import Language.Symantic.Expr as Expr
24 import Language.Symantic.Repr
31 e1 = (>>=) (list $ int Functor.<$> [1..3])
32 (lam $ \i -> list [i, i])
46 ex_from = root_expr_from (Proxy::Proxy Ex)
51 Left err -> Left err @?= Prelude.snd `Arrow.left` expected
52 Right (Exists_Type_and_Repr ty (Forall_Repr r)) ->
54 Left (_, err) -> Right ("…"::String) @?= Left err
55 Right (ty_expected::Type_Root_of_Expr Ex h, _::h, _::Text) ->
56 (Monad.>>= (@?= (\(_::Proxy h, err) -> err) `Arrow.left` expected)) $
57 case ty `eq_type` ty_expected of
58 Nothing -> Monad.return $ Left $
59 error_expr (Proxy::Proxy Ex) $
60 Error_Expr_Type_mismatch ast
62 (Exists_Type ty_expected)
64 let h = host_from_expr r
70 -- , (text_from_expr :: Repr_Text h -> Text) r
74 tests = testGroup "Monad"
78 , AST "int" [AST "1" []]
79 , AST "int" [AST "2" []]
80 , AST "int" [AST "3" []]
83 [ AST "x" [], AST "Int" []
86 , AST "var" [ AST "x" [] ]
87 , AST "var" [ AST "x" [] ]
93 , "[1, 2, 3] >>= (\\x0 -> [x0, x0])" )
95 [ AST "just" [ AST "int" [AST "1" []] ]
97 [ AST "x" [], AST "Int" []
103 ( type_maybe type_int
105 , "just 1 >>= (\\x0 -> nothing)" )
109 , AST "int" [AST "1" []]
112 [ AST "x" [], AST "Int" []
115 , AST "bool" [AST "True" []]
119 ( type_either type_bool type_int
121 , "right 1 >>= (\\x0 -> left True)" )