on 7c33c13 help sign in
98 lines 1.4 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Generate.JavaScript.Helpers
3 ( varDecl
4 , refOrObject
5 , ref
6 , (==>)
7 , obj
8 , (<|)
9 , function
10 , toFieldName
11 )
12 where
15import qualified Data.Char as Char
16import qualified Data.Text as Text
17import Data.Text (Text)
19import Generate.JavaScript.Builder
23-- DECLARATIONS
26varDecl :: Text -> Expr -> VarDecl
27varDecl x expr =
28 VarDecl (Id x) (Just expr)
31refOrObject :: Text -> Expr
32refOrObject name =
33 Infix OpLOr (ref name) (Object [])
37-- VARIABLES
40ref :: Text -> Expr
41ref name =
42 VarRef (Id name)
45(==>) :: Text -> Expr -> (Id, Expr)
46(==>) name expr =
47 ( Id name, expr )
50obj :: [Text] -> Expr
51obj vars =
52 case vars of
53 x:xs ->
54 foldl DotRef (ref x) (map Id xs)
56 [] ->
57 error "dotSep must be called on a non-empty list of variables"
61-- FUNCTION CALLS
64(<|) :: Expr -> Expr -> Expr
65(<|) f x =
66 Call f [x]
69function :: [Text] -> [Stmt] -> Expr
70function args stmts =
71 Function Nothing (map Id args) stmts
75-- FIELD NAMES
78toFieldName :: Int -> Text
79toFieldName word =
80 Text.pack (toFieldNameHelp word [])
83toFieldNameHelp :: Int -> [Char] -> [Char]
84toFieldNameHelp word str =
85 if word < 52 then
86 toChar word : str
88 else
89 let
90 (next, remainder) =
91 quotRem word 52
92 in
93 toFieldNameHelp next (toChar remainder : str)
96toChar :: Int -> Char
97toChar word =
98 Char.chr $ fromIntegral $ word + (if word < 26 then 97 else 39)