4import Data.Char (isDigit)
5import Data.List (intercalate,isPrefixOf)
6import qualified Data.Set as Set
10data Type = LambdaT Type Type
13 | Super (Set.Set Type)
16data Scheme = Forall [X] [Context String Constraint] Type deriving (Eq, Ord)
18data Constraint = Type :=: Type
21 deriving (Eq, Ord, Show)
23data Context c v = Context c v deriving (Eq, Show)
25ctx c = Context ("`" ++ show c ++ "'")
26extendCtx ctx2 (Context ctx1 c) = Context (ctx1 ++ " in " ++ ctx2) c
28instance (Ord a, Eq c) => Ord (Context c a) where
29 compare (Context _ x) (Context _ y) = compare x y
37number = Super (Set.fromList [ int, float ])
42string = listOf char -- tipe "String"
45time = Super (Set.fromList [ int, float ])
47element = tipe "Element"
48direction = tipe "Direction"
54listOf t = ADT "List" [t]
55signalOf t = ADT "Signal" [t]
56tupleOf ts = ADT ("Tuple" ++ show (length ts)) ts
57maybeOf t = ADT "Maybe" [t]
58pairOf t = tupleOf [t,t]
60appendable t = Super (Set.fromList [ string, text, listOf t ])
61comparable = Super (Set.fromList [ int, float, char, string ])
62transformable = Super (Set.fromList [ shape, line ])
65jsNumber = tipe "JSNumber"
66jsString = tipe "JSString"
67jsElement = tipe "JSElement"
68jsArray t = ADT "JSArray" [t]
69jsTuple ts = ADT ("JSTuple" ++ show (length ts)) ts
70jsonValue = tipe "JsonValue"
71jsonObject = tipe "JsonObject"
74t1 ==> t2 = LambdaT t1 t2
77name -: tipe = (,) name $ Forall [] [] tipe
81parens = ("("++) . (++")")
83instance Show Type where
86 { LambdaT t1@(LambdaT _ _) t2 -> parens (show t1) ++ " -> " ++ show t2
87 ; LambdaT t1 t2 -> show t1 ++ " -> " ++ show t2
88 ; VarT x -> 't' : show x
89 ; ADT "List" [ADT "Char" []] -> "String"
90 ; ADT "List" [tipe] -> "[" ++ show tipe ++ "]"
93 then parens . intercalate "," $ map show cs
94 else case cs of [] -> name
95 _ -> parens $ name ++ " " ++ unwords (map show cs)
96 ; Super ts -> "{" ++ (intercalate "," . map show $ Set.toList ts) ++ "}"
99instance Show Scheme where
100 show (Forall xs cs t) = "Forall " ++ show xs ++ cs' ++ "\n " ++ show t
101 where cs' = concatMap (concatMap ("\n "++) . lines . show) cs
103isTupleString 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