{-# LANGUAGE FlexibleContexts #-}
module Language.JS.Common where

import qualified Text.Parsec as P

parens, braces, angles, brackets :: P.Stream s m Char =>
                                    P.ParsecT s u m a -> P.ParsecT s u m a
parens :: ParsecT s u m a -> ParsecT s u m a
parens   = ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m a -> ParsecT s u m a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
P.between (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string String
"(") (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string String
")")
braces :: ParsecT s u m a -> ParsecT s u m a
braces   = ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m a -> ParsecT s u m a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
P.between (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string String
"{") (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string String
"}")
angles :: ParsecT s u m a -> ParsecT s u m a
angles   = ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m a -> ParsecT s u m a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
P.between (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string String
"<") (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string String
">")
brackets :: ParsecT s u m a -> ParsecT s u m a
brackets = ParsecT s u m String
-> ParsecT s u m String -> ParsecT s u m a -> ParsecT s u m a
forall s (m :: * -> *) t u open close a.
Stream s m t =>
ParsecT s u m open
-> ParsecT s u m close -> ParsecT s u m a -> ParsecT s u m a
P.between (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string String
"[") (String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string String
"]")

semi, comma, dot, colon :: P.Stream s m Char => P.ParsecT s u m String
semi :: ParsecT s u m String
semi  = String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string String
";"
comma :: ParsecT s u m String
comma = String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string String
","
dot :: ParsecT s u m String
dot   = String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string String
"."
colon :: ParsecT s u m String
colon = String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string String
":"

dotSep, commaSep, semiSep :: P.Stream s m Char => P.ParsecT s u m a -> P.ParsecT s u m [a]
dotSep :: ParsecT s u m a -> ParsecT s u m [a]
dotSep ParsecT s u m a
p = ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m [a]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
P.sepBy1 ParsecT s u m a
p ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
dot
commaSep :: ParsecT s u m a -> ParsecT s u m [a]
commaSep ParsecT s u m a
p = ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m [a]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
P.sepBy ParsecT s u m a
p ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
comma
semiSep :: ParsecT s u m a -> ParsecT s u m [a]
semiSep  ParsecT s u m a
p = ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m [a]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
P.sepBy ParsecT s u m a
p ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
semi

commaSep1, semiSep1 :: P.Stream s m Char => P.ParsecT s u m a -> P.ParsecT s u m [a]
commaSep1 :: ParsecT s u m a -> ParsecT s u m [a]
commaSep1 ParsecT s u m a
p = ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m [a]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
P.sepBy1 ParsecT s u m a
p ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
comma
semiSep1 :: ParsecT s u m a -> ParsecT s u m [a]
semiSep1  ParsecT s u m a
p = ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m [a]
forall s (m :: * -> *) t u a sep.
Stream s m t =>
ParsecT s u m a -> ParsecT s u m sep -> ParsecT s u m [a]
P.sepBy1 ParsecT s u m a
p ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
semi

whiteSpace :: P.Stream s m Char => P.ParsecT s u m Char
whiteSpace :: ParsecT s u m Char
whiteSpace = String -> ParsecT s u m Char
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m Char
P.oneOf String
" \n\t"

whiteSpaces :: P.Stream s m Char => P.ParsecT s u m String
whiteSpaces :: ParsecT s u m String
whiteSpaces = ParsecT s u m Char -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m [a]
P.many ParsecT s u m Char
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m Char
whiteSpace

betweenSpaces :: P.Stream s m Char => P.ParsecT s u m a -> P.ParsecT s u m a
betweenSpaces :: ParsecT s u m a -> ParsecT s u m a
betweenSpaces ParsecT s u m a
p = ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
whiteSpaces ParsecT s u m String -> ParsecT s u m a -> ParsecT s u m a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> ParsecT s u m a
p ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
whiteSpaces

lexeme :: P.Stream s m Char => P.ParsecT s u m a -> P.ParsecT s u m a
lexeme :: ParsecT s u m a -> ParsecT s u m a
lexeme ParsecT s u m a
p = ParsecT s u m a
p ParsecT s u m a -> ParsecT s u m String -> ParsecT s u m a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* ParsecT s u m String
forall s (m :: * -> *) u. Stream s m Char => ParsecT s u m String
whiteSpaces

keywordB :: P.Stream s m Char => String -> P.ParsecT s u m String
keywordB :: String -> ParsecT s u m String
keywordB = ParsecT s u m String -> ParsecT s u m String
forall s u (m :: * -> *) a. ParsecT s u m a -> ParsecT s u m a
P.try (ParsecT s u m String -> ParsecT s u m String)
-> (String -> ParsecT s u m String)
-> String
-> ParsecT s u m String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ParsecT s u m String -> ParsecT s u m String
forall s (m :: * -> *) u a.
Stream s m Char =>
ParsecT s u m a -> ParsecT s u m a
lexeme (ParsecT s u m String -> ParsecT s u m String)
-> (String -> ParsecT s u m String)
-> String
-> ParsecT s u m String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ParsecT s u m String
forall s (m :: * -> *) u.
Stream s m Char =>
String -> ParsecT s u m String
P.string

-- | reserved words
reservedWords :: [String]
reservedWords :: [String]
reservedWords = [String
"async", String
"await", String
"yield", String
"delete", String
"void", String
"typeof",
                 String
"instanceof", String
"new", String
"debugger",
                 String
"var", String
"let", String
"const",
                 String
"switch", String
"case", String
"break", String
"default",
                 String
"try", String
"catch", String
"finally",
                 String
"for", String
"while", String
"do", String
"in", String
"of", String
"continue",
                 String
"if", String
"else",
                 String
"with",
                 String
"function", String
"return",
                 String
"class", String
"extends", String
"static", String
"get", String
"set", String
"super",
                 String
"import", String
"from", String
"export", String
"as"
                ]