1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module AST.Variable where
6import qualified Data.Maybe as Maybe
7import qualified Data.Text as Text
10import qualified AST.Helpers as Help
11import qualified AST.Module.Name as ModuleName
28 | Module ModuleName.Canonical
29 | TopLevel ModuleName.Canonical
34data Canonical = Canonical
41local :: Text -> Canonical
46topLevel :: ModuleName.Canonical -> Text -> Canonical
48 Canonical (TopLevel home) x
51builtin :: Text -> Canonical
56fromModule :: ModuleName.Canonical -> Text -> Canonical
58 Canonical (Module home) name
61inCore :: ModuleName.Raw -> Text -> Canonical
63 Canonical (Module (ModuleName.inCore home)) name
66inHtml :: ModuleName.Raw -> Text -> Canonical
68 Canonical (Module (ModuleName.inHtml home)) name
73 inCore ["Platform","Cmd"] "Cmd"
78 inCore ["Platform","Sub"] "Sub"
82-- VARIABLE RECOGNIZERS
85isLocalHome :: Home -> Bool
101is :: ModuleName.Raw -> Text -> Canonical -> Bool
103 var == inCore home name
106isJson :: Canonical -> Bool
108 is ["Json", "Encode"] "Value"
111isMaybe :: Canonical -> Bool
115isArray :: Canonical -> Bool
120isTask :: Canonical -> Bool
125isList :: Canonical -> Bool
127 v == Canonical BuiltIn "List"
130isTuple :: Canonical -> Bool
133 Canonical BuiltIn name ->
140isPrimitive :: Canonical -> Bool
143 Canonical BuiltIn name ->
144 name `elem` ["Int","Float","String","Bool"]
149isPrim :: Text -> Canonical -> Bool
150isPrim prim (Canonical home name) =
159isLocal :: (Text -> Bool) -> Canonical -> Bool
160isLocal check (Canonical home name) =
173class ToString a where
174 toString :: a -> String
177instance ToString Raw where
178 toString (Raw name) =
182instance ToString Canonical where
183 toString (Canonical home name) =
189 ModuleName.canonicalToString moduleName ++ "." ++ Text.unpack name
202-- | A listing of values. Something like (a,b,c) or (..) or (a,b,..)
203data Listing a = Listing
210openListing :: Listing a
215closedListing :: Listing a
220listing :: [a] -> Listing a
225-- | A value that can be imported or exported
229 | Union !String !(Listing String)
234-- CATEGORIZING VALUES
237getValues :: [Value] -> [String]
239 Maybe.mapMaybe getValue values
242getValue :: Value -> Maybe String
245 Value name -> Just name
250getAliases :: [Value] -> [String]
252 Maybe.mapMaybe getAlias values
255getAlias :: Value -> Maybe String
259 Alias name -> Just name
263getUnions :: [Value] -> [(String, Listing String)]
265 Maybe.mapMaybe getUnion values
268getUnion :: Value -> Maybe (String, Listing String)
273 Union name ctors -> Just (name, ctors)
277-- BINARY SERIALIZATION
280instance Binary Canonical where
281 put (Canonical home name) =
284 putWord8 0 >> put name
287 putWord8 1 >> put path >> put name
290 putWord8 2 >> put path >> put name
293 putWord8 3 >> put name
298 0 -> Canonical BuiltIn <$> get
299 1 -> Canonical . Module <$> get <*> get
300 2 -> Canonical . TopLevel <$> get <*> get
301 3 -> Canonical Local <$> get
302 _ -> error "Unexpected tag when deserializing canonical variable"
305instance Binary Value where
309 putWord8 0 >> put name
312 putWord8 1 >> put name
315 putWord8 2 >> put name >> put ctors
322 2 -> Union <$> get <*> get
323 _ -> error "Error reading valid import/export information from serialized string"
326instance (Binary a) => Binary (Listing a) where
327 put (Listing explicits open) =
328 put explicits >> put open
330 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