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"
80 inCore ["Platform"] "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
127isSignal :: Canonical -> Bool
129 is ["Signal"] "Signal"
132isText :: Canonical -> Bool
137isList :: Canonical -> Bool
139 v == Canonical BuiltIn "List"
142isTuple :: Canonical -> Bool
145 Canonical BuiltIn name -> Help.isTuple name
149isPrimitive :: Canonical -> Bool
152 Canonical BuiltIn name ->
153 name `elem` ["Int","Float","String","Bool"]
158isPrim :: String -> Canonical -> Bool
159isPrim prim (Canonical home name) =
168isLocal :: (String -> Bool) -> Canonical -> Bool
169isLocal check (Canonical home name) =
182class ToString a where
183 toString :: a -> String
186instance ToString Raw where
187 toString (Raw name) =
191instance ToString Canonical where
192 toString (Canonical home name) =
198 ModuleName.canonicalToString moduleName ++ "." ++ name
211-- | A listing of values. Something like (a,b,c) or (..) or (a,b,..)
212data Listing a = Listing
219openListing :: Listing a
224closedListing :: Listing a
229listing :: [a] -> Listing a
234-- | A value that can be imported or exported
238 | Union !String !(Listing String)
243-- CATEGORIZING VALUES
246getValues :: [Value] -> [String]
248 Maybe.mapMaybe getValue values
251getValue :: Value -> Maybe String
254 Value name -> Just name
259getAliases :: [Value] -> [String]
261 Maybe.mapMaybe getAlias values
264getAlias :: Value -> Maybe String
268 Alias name -> Just name
272getUnions :: [Value] -> [(String, Listing String)]
274 Maybe.mapMaybe getUnion values
277getUnion :: Value -> Maybe (String, Listing String)
282 Union name ctors -> Just (name, ctors)
286-- BINARY SERIALIZATION
289instance Binary Canonical where
290 put (Canonical home name) =
293 putWord8 0 >> put name
296 putWord8 1 >> put path >> put name
299 putWord8 2 >> put path >> put name
302 putWord8 3 >> put name
307 0 -> Canonical BuiltIn <$> get
308 1 -> Canonical . Module <$> get <*> get
309 2 -> Canonical . TopLevel <$> get <*> get
310 3 -> Canonical Local <$> get
311 _ -> error "Unexpected tag when deserializing canonical variable"
314instance Binary Value where
318 putWord8 0 >> put name
321 putWord8 1 >> put name
324 putWord8 2 >> put name >> put ctors
331 2 -> Union <$> get <*> get
332 _ -> error "Error reading valid import/export information from serialized string"
335instance (Binary a) => Binary (Listing a) where
336 put (Listing explicits open) =
337 put explicits >> put open
339 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