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.Traversable.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.Functor.Identity
18 import Data.Proxy (Proxy(..))
19 import Data.Text (Text)
20 import Data.Type.Equality ((:~:)(Refl))
21 import Prelude hiding ((&&), not, (||), (==), (<$>), (+), Applicative(..), Monad(..), Traversable(..))
23 import Language.Symantic.Type
24 import Language.Symantic.Expr as Expr
25 import Language.Symantic.Repr
32 e1 = traverse (val Right)
33 (list $ int Functor.<$> [1..3])
36 type Ex lam = Expr_Root
38 .|. Expr_Lambda_Val lam
44 .|. Expr_Applicative lam
45 .|. Expr_Traversable lam
48 ex_from = root_expr_from (Proxy::Proxy (Ex lam)) (Proxy::Proxy lam)
53 Left err -> Left err @?= snd `Arrow.left` expected
54 Right (Exists_Type_and_Repr ty (Forall_Repr r)) ->
56 Left (_, err) -> Right ("…"::String) @?= Left err
57 Right (ty_expected::Type_Root_of_Expr (Ex Identity) h, _::h, _::Text) ->
58 (Monad.>>= (@?= (\(_::Proxy h, err) -> err) `Arrow.left` expected)) $
59 case ty `eq_type` ty_expected of
60 Nothing -> Monad.return $ Left $
61 error_expr (Proxy::Proxy (Ex Identity)) $
62 Error_Expr_Type_mismatch ast
64 (Exists_Type ty_expected)
66 let h = runIdentity $ host_from_expr r
72 -- , (text_from_expr :: Repr_Text Identity h -> Text) r
76 tests = testGroup "Traversable"
79 [ AST "x" [], AST "Int" []
80 , AST "just" [ AST "var" [ AST "x" [] ] ]
84 , AST "int" [AST "1" []]
85 , AST "int" [AST "2" []]
86 , AST "int" [AST "3" []]
89 ( type_maybe (type_list type_int)
91 , "traverse (\\x0 -> just x0) [1, 2, 3]" )
94 [ AST "x" [], AST "Int" []
95 , AST "right" [ AST "Int" [], AST "var" [ AST "x" [] ] ]
99 , AST "int" [AST "1" []]
100 , AST "int" [AST "2" []]
101 , AST "int" [AST "3" []]
104 ( type_either type_int (type_list type_int)
106 , "traverse (\\x0 -> (right x0)) [1, 2, 3]" )