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
22data TopLevel = TopLevelVar
23 { topHome :: ModuleName.Canonical
35 | Module ModuleName.Canonical
36 | TopLevel ModuleName.Canonical
41data Canonical = Canonical
48local :: String -> Canonical
53topLevel :: ModuleName.Canonical -> String -> Canonical
55 Canonical (TopLevel home) x
58builtin :: String -> Canonical
63fromModule :: ModuleName.Canonical -> String -> Canonical
65 Canonical (Module home) name
68inCore :: ModuleName.Raw -> String -> Canonical
70 Canonical (Module (ModuleName.inCore home)) name
73inHtml :: ModuleName.Raw -> String -> Canonical
75 Canonical (Module (ModuleName.inHtml home)) name
80 inCore ["Platform","Cmd"] "Cmd"
85 inCore ["Platform","Sub"] "Sub"
89-- VARIABLE RECOGNIZERS
92isLocalHome :: Home -> Bool
108is :: ModuleName.Raw -> String -> Canonical -> Bool
110 var == inCore home name
113isJson :: Canonical -> Bool
115 is ["Json", "Encode"] "Value"
118isMaybe :: Canonical -> Bool
122isArray :: Canonical -> Bool
127isTask :: Canonical -> Bool
132isList :: Canonical -> Bool
134 v == Canonical BuiltIn "List"
137isTuple :: Canonical -> Bool
140 Canonical BuiltIn name -> Help.isTuple name
144isPrimitive :: Canonical -> Bool
147 Canonical BuiltIn name ->
148 name `elem` ["Int","Float","String","Bool"]
153isPrim :: String -> Canonical -> Bool
154isPrim prim (Canonical home name) =
163isLocal :: (String -> Bool) -> Canonical -> Bool
164isLocal check (Canonical home name) =
177class ToString a where
178 toString :: a -> String
181instance ToString Raw where
182 toString (Raw name) =
186instance ToString Canonical where
187 toString (Canonical home name) =
193 ModuleName.canonicalToString moduleName ++ "." ++ name
206-- | A listing of values. Something like (a,b,c) or (..) or (a,b,..)
207data Listing a = Listing
214openListing :: Listing a
219closedListing :: Listing a
224listing :: [a] -> Listing a
229-- | A value that can be imported or exported
233 | Union !String !(Listing String)
238-- CATEGORIZING VALUES
241getValues :: [Value] -> [String]
243 Maybe.mapMaybe getValue values
246getValue :: Value -> Maybe String
249 Value name -> Just name
254getAliases :: [Value] -> [String]
256 Maybe.mapMaybe getAlias values
259getAlias :: Value -> Maybe String
263 Alias name -> Just name
267getUnions :: [Value] -> [(String, Listing String)]
269 Maybe.mapMaybe getUnion values
272getUnion :: Value -> Maybe (String, Listing String)
277 Union name ctors -> Just (name, ctors)
281-- BINARY SERIALIZATION
284instance Binary Canonical where
285 put (Canonical home name) =
288 putWord8 0 >> put name
291 putWord8 1 >> put path >> put name
294 putWord8 2 >> put path >> put name
297 putWord8 3 >> put name
302 0 -> Canonical BuiltIn <$> get
303 1 -> Canonical . Module <$> get <*> get
304 2 -> Canonical . TopLevel <$> get <*> get
305 3 -> Canonical Local <$> get
306 _ -> error "Unexpected tag when deserializing canonical variable"
309instance Binary Value where
313 putWord8 0 >> put name
316 putWord8 1 >> put name
319 putWord8 2 >> put name >> put ctors
326 2 -> Union <$> get <*> get
327 _ -> error "Error reading valid import/export information from serialized string"
330instance (Binary a) => Binary (Listing a) where
331 put (Listing explicits open) =
332 put explicits >> put open
334 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