1module AST.Variable where
4import qualified Data.Maybe as Maybe
6import qualified AST.Helpers as Help
7import qualified AST.Module.Name as ModuleName
14newtype Raw = Raw String
24 | Module ModuleName.Canonical
25 | TopLevel ModuleName.Canonical
30data Canonical = Canonical
37local :: String -> Canonical
42topLevel :: ModuleName.Canonical -> String -> Canonical
44 Canonical (TopLevel home) x
47builtin :: String -> Canonical
52fromModule :: ModuleName.Canonical -> String -> Canonical
54 Canonical (Module home) name
57inCore :: ModuleName.Raw -> String -> Canonical
59 Canonical (Module (ModuleName.inCore home)) name
62inHtml :: ModuleName.Raw -> String -> Canonical
64 Canonical (Module (ModuleName.inHtml home)) name
69 inCore ["Platform","Cmd"] "Cmd"
74 inCore ["Platform","Sub"] "Sub"
78-- VARIABLE RECOGNIZERS
81isLocalHome :: Home -> Bool
97is :: ModuleName.Raw -> String -> Canonical -> Bool
99 var == inCore home name
102isJson :: Canonical -> Bool
104 is ["Json", "Encode"] "Value"
107isMaybe :: Canonical -> Bool
111isArray :: Canonical -> Bool
116isTask :: Canonical -> Bool
121isList :: Canonical -> Bool
123 v == Canonical BuiltIn "List"
126isTuple :: Canonical -> Bool
129 Canonical BuiltIn name -> Help.isTuple name
133isPrimitive :: Canonical -> Bool
136 Canonical BuiltIn name ->
137 name `elem` ["Int","Float","String","Bool"]
142isPrim :: String -> Canonical -> Bool
143isPrim prim (Canonical home name) =
152isLocal :: (String -> Bool) -> Canonical -> Bool
153isLocal check (Canonical home name) =
166class ToString a where
167 toString :: a -> String
170instance ToString Raw where
171 toString (Raw name) =
175instance ToString Canonical where
176 toString (Canonical home name) =
182 ModuleName.canonicalToString moduleName ++ "." ++ name
195-- | A listing of values. Something like (a,b,c) or (..) or (a,b,..)
196data Listing a = Listing
203openListing :: Listing a
208closedListing :: Listing a
213listing :: [a] -> Listing a
218-- | A value that can be imported or exported
222 | Union !String !(Listing String)
227-- CATEGORIZING VALUES
230getValues :: [Value] -> [String]
232 Maybe.mapMaybe getValue values
235getValue :: Value -> Maybe String
238 Value name -> Just name
243getAliases :: [Value] -> [String]
245 Maybe.mapMaybe getAlias values
248getAlias :: Value -> Maybe String
252 Alias name -> Just name
256getUnions :: [Value] -> [(String, Listing String)]
258 Maybe.mapMaybe getUnion values
261getUnion :: Value -> Maybe (String, Listing String)
266 Union name ctors -> Just (name, ctors)
270-- BINARY SERIALIZATION
273instance Binary Canonical where
274 put (Canonical home name) =
277 putWord8 0 >> put name
280 putWord8 1 >> put path >> put name
283 putWord8 2 >> put path >> put name
286 putWord8 3 >> put name
291 0 -> Canonical BuiltIn <$> get
292 1 -> Canonical . Module <$> get <*> get
293 2 -> Canonical . TopLevel <$> get <*> get
294 3 -> Canonical Local <$> get
295 _ -> error "Unexpected tag when deserializing canonical variable"
298instance Binary Value where
302 putWord8 0 >> put name
305 putWord8 1 >> put name
308 putWord8 2 >> put name >> put ctors
315 2 -> Union <$> get <*> get
316 _ -> error "Error reading valid import/export information from serialized string"
319instance (Binary a) => Binary (Listing a) where
320 put (Listing explicits open) =
321 put explicits >> put open
323 get = Listing <$> get <*> get
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