2module Types.Types where
5import Data.Char (isDigit)
6import Data.List (intercalate,isPrefixOf)
7import qualified Data.Set as Set
8import qualified Data.Map as Map
12data Type = LambdaT Type Type
16 | RecordT (Map.Map String [Type]) Type
17 | Super (Set.Set Type)
20data Scheme = Forall [X] [Context Constraint] Type deriving (Eq, Ord)
22data Constraint = Type :=: Type
25 deriving (Eq, Ord, Show)
27recordT :: [(String,Type)] -> Map.Map String [Type]
29 foldl (\r (x,t) -> Map.insertWith (++) x [t] r) Map.empty fields
35number = Super (Set.fromList [ int, float ])
40string = listOf char -- tipe "String"
43time = float --tipe "Time"
48element = tipe "Element"
49direction = tipe "Direction"
54position = tipe "Position"
55location = tipe "Location"
57listOf t = ADT "List" [t]
58signalOf t = ADT "Signal" [t]
59tupleOf ts = ADT ("Tuple" ++ show (length ts)) ts
60maybeOf t = ADT "Maybe" [t]
61pairOf t = tupleOf [t,t]
63appendable t = Super (Set.fromList [ string, text, listOf t ])
64comparable = Super (Set.fromList [ int, float, char, string, time, date ])
67jsNumber = tipe "JSNumber"
68jsString = tipe "JSString"
69jsElement = tipe "JSElement"
70jsArray t = ADT "JSArray" [t]
71jsTuple ts = ADT ("JSTuple" ++ show (length ts)) ts
72jsonValue = tipe "JsonValue"
73jsonObject = tipe "JsonObject"
76t1 ==> t2 = LambdaT t1 t2
79name -: tipe = (,) name $ Forall [] [] tipe
83parens = ("("++) . (++")")
85instance Show Type where
88 { LambdaT t1@(LambdaT _ _) t2 -> parens (show t1) ++ " -> " ++ show t2
89 ; LambdaT t1 t2 -> show t1 ++ " -> " ++ show t2
90 ; VarT x -> 't' : show x
91 ; ADT "List" [ADT "Char" []] -> "String"
92 ; ADT "List" [tipe] -> "[" ++ show tipe ++ "]"
95 then parens . intercalate "," $ map show cs
98 _ -> parens $ name ++ " " ++ unwords (map show cs)
99 ; Super ts -> "{" ++ (intercalate "," . map show $ Set.toList ts) ++ "}"
100 ; EmptyRecord -> "{}"
102 start ++ intercalate ", " (concatMap fields $ Map.toList fs) ++ " }"
103 where field n s = n ++ " :: " ++ show s
104 fields (n,ss) = map (field n) ss
107 _ -> "{ " ++ show t ++ " | "
110instance Show Scheme where
111 show (Forall [] [] t) = show t
112 show (Forall xs cs t) =
113 concat [ "Forall ", show xs
114 , concatMap (("\n "++) . show) cs
115 , "\n ", parens (show t) ]
117isTupleString str = "Tuple" `isPrefixOf` str && all isDigit (drop 5 str)
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list