1 {-# LANGUAGE AllowAmbiguousTypes #-}
2 {-# LANGUAGE PolyKinds #-}
3 module Language.Symantic.Typing.Read where
5 import Language.Symantic.Grammar
6 import Language.Symantic.Typing.Kind
7 import Language.Symantic.Typing.Type
8 import Language.Symantic.Typing.Show ()
9 import Language.Symantic.Typing.Grammar
10 import Language.Symantic.Typing.Variable
12 -- | Read a 'Type' from an 'AST_Type', given its 'Vars'.
14 SourceInj (KindK src) src =>
15 SourceInj (TypeVT src) src =>
16 SourceInj (AST_Type src) src =>
18 Either (Error_Type src) (TypeVT src)
19 readType ast | EVars vs <- readVars (EVars VarsZ) ast = do
20 TypeT ty <- readTyVars vs ast
23 -- | Read a 'Type' from an 'AST_Type', given its 'Vars'.
26 SourceInj (KindK src) src =>
27 SourceInj (TypeVT src) src =>
28 SourceInj (AST_Type src) src =>
31 Either (Error_Type src) (TypeT src vs)
32 readTyVars vs (BinTree0 (Token_Type_Const (TypeTLen t))) =
33 Right $ t (lenVars vs)
34 -- readTyName is ms (sourceInj ast) (lenVars vs) name
35 readTyVars vs (BinTree0 (Token_Type_Var (Sourced src name))) =
36 case lookupVars name vs of
37 Just (EVar v) -> Right $ TypeT $ TyVar src name v
38 Nothing -> error "[BUG] readTyVars: lookupVars failed"
39 readTyVars vs ast@(ast_x `BinTree2` ast_y) = do
40 TypeT ty_x <- readTyVars vs ast_x
41 TypeT ty_y <- readTyVars vs ast_y
42 when_KiFun (kindOf ty_x) $ \Refl ki_x_a _ki_x_b ->
43 when_EqKind ki_x_a (kindOf ty_y) $ \Refl ->
44 Right $ TypeT $ TyApp (sourceInj ast) ty_x ty_y
46 -- | Return the given 'EVars' augmented by the ones used in given 'AST_Type'.
47 readVars :: Source src => EVars src -> AST_Type src -> EVars src
48 readVars evs@(EVars vs) (BinTree0 (Token_Type_Var (Sourced _src name))) =
49 case lookupVars name vs of
52 let kv = KiType noSource
53 let vs' = VarsS name kv vs
55 readVars evs BinTree0{} = evs
56 readVars evs (BinTree2 x y) =
57 readVars (readVars evs x) y