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
75 inCore ["Platform","Cmd"] "Cmd"
80 inCore ["Platform","Sub"] "Sub"
84-- VARIABLE RECOGNIZERS
87isLocalHome :: Home -> Bool
103is :: ModuleName.Raw -> String -> Canonical -> Bool
105 var == inCore home name
108isJson :: Canonical -> Bool
110 is ["Json", "Encode"] "Value"
113isMaybe :: Canonical -> Bool
117isArray :: Canonical -> Bool
122isTask :: Canonical -> Bool
127isList :: Canonical -> Bool
129 v == Canonical BuiltIn "List"
132isTuple :: Canonical -> Bool
135 Canonical BuiltIn name -> Help.isTuple name
139isPrimitive :: Canonical -> Bool
142 Canonical BuiltIn name ->
143 name `elem` ["Int","Float","String","Bool"]
148isPrim :: String -> Canonical -> Bool
149isPrim prim (Canonical home name) =
158isLocal :: (String -> Bool) -> Canonical -> Bool
159isLocal check (Canonical home name) =
172class ToString a where
173 toString :: a -> String
176instance ToString Raw where
177 toString (Raw name) =
181instance ToString Canonical where
182 toString (Canonical home name) =
188 ModuleName.canonicalToString moduleName ++ "." ++ name
201-- | A listing of values. Something like (a,b,c) or (..) or (a,b,..)
202data Listing a = Listing
209openListing :: Listing a
214closedListing :: Listing a
219listing :: [a] -> Listing a
224-- | A value that can be imported or exported
228 | Union !String !(Listing String)
233-- CATEGORIZING VALUES
236getValues :: [Value] -> [String]
238 Maybe.mapMaybe getValue values
241getValue :: Value -> Maybe String
244 Value name -> Just name
249getAliases :: [Value] -> [String]
251 Maybe.mapMaybe getAlias values
254getAlias :: Value -> Maybe String
258 Alias name -> Just name
262getUnions :: [Value] -> [(String, Listing String)]
264 Maybe.mapMaybe getUnion values
267getUnion :: Value -> Maybe (String, Listing String)
272 Union name ctors -> Just (name, ctors)
276-- BINARY SERIALIZATION
279instance Binary Canonical where
280 put (Canonical home name) =
283 putWord8 0 >> put name
286 putWord8 1 >> put path >> put name
289 putWord8 2 >> put path >> put name
292 putWord8 3 >> put name
297 0 -> Canonical BuiltIn <$> get
298 1 -> Canonical . Module <$> get <*> get
299 2 -> Canonical . TopLevel <$> get <*> get
300 3 -> Canonical Local <$> get
301 _ -> error "Unexpected tag when deserializing canonical variable"
304instance Binary Value where
308 putWord8 0 >> put name
311 putWord8 1 >> put name
314 putWord8 2 >> put name >> put ctors
321 2 -> Union <$> get <*> get
322 _ -> error "Error reading valid import/export information from serialized string"
325instance (Binary a) => Binary (Listing a) where
326 put (Listing explicits open) =
327 put explicits >> put open
329 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