on 973bf00 help sign in
74 lines 1.1 kB history raw
1import qualified Data.Char as Char
2import Data.Word (Word16, Word32)
6-- SYMBOLS
9data Symbol =
10 Symbol
11 { _home :: !Word16
12 , _name :: !Word32
13 }
17-- BINARY
20instance Binary Symbol where
21 put (Symbol home name) =
22 put home >> put name
24 get =
25 liftM2 Symbol get get
29-- EXPRESSION
32toExpr :: Symbol -> JS.Expr
33toExpr (Symbol home name) =
34 JS.DotRef (JS.ref (homeToText home)) (JS.Id (nameToText name))
37homeToText :: Word16 -> Text
38homeToText word =
39 Text.pack ('$' : show word)
42nameToText :: Word32 -> Text
43nameToText word =
44 Text.pack (makeName word "")
47makeName :: Word32 -> String -> String
48makeName word str =
49 if word < 26 then
50 makeChar 97 word : str
52 else if word < 52 then
53 makeChar 65 (word - 26) : str
55 else
56 let
57 (next, leftover) =
58 quotRem word 52
59 in
60 makeName next (makeInnerChar leftover : str)
63makeInnerChar :: Word32 -> Char
64makeInnerChar word =
65 if word < 26 then
66 makeChar 97 word
67 else
68 makeChar 65 (word - 26)
71{-# INLINE makeChar #-}
72makeChar :: Word32 -> Word32 -> Char
73makeChar root offset =
74 Char.chr (fromIntegral (root + offset))