forml-0.2: src/hs/Forml/Javascript.hs
{-# LANGUAGE FlexibleContexts, FlexibleInstances, FunctionalDependencies,
MultiParamTypeClasses, NamedFieldPuns, OverlappingInstances,
QuasiQuotes, RankNTypes, RecordWildCards, TypeSynonymInstances,
UndecidableInstances #-}
module Forml.Javascript (render, render_spec) where
import Prelude hiding (curry, (++))
import qualified Data.Map as M
import Language.Javascript.JMacro
import Forml.Javascript.Backend
import Forml.Types.Statement
import Forml.Parser
class Compress a where
comp :: a -> a
instance (Compress a, Compress b) => Compress (a, b) where
comp (a, b) = (comp a, comp b)
instance (Functor m, Compress a) => Compress (m a) where
comp x = fmap comp x
instance Compress JStat where
comp (ReturnStat x) = ReturnStat (comp x)
comp (IfStat a b c) = IfStat (comp a) (comp b) (comp c)
comp (WhileStat a b c) = WhileStat a (comp b) (comp c)
comp (ForInStat a b c d) = ForInStat a b (comp c) (comp d)
comp (SwitchStat a b c) = SwitchStat (comp a) (comp b) (comp c)
comp (TryStat a b c d) = TryStat (comp a) b (comp c) (comp d)
comp (BlockStat xs) = BlockStat (comp xs)
comp (ApplStat a b) = ApplStat (comp a) (comp b)
comp (PPostStat a b c) = PPostStat a b (comp c)
comp (AssignStat a b) = AssignStat (comp a) (comp b)
comp (UnsatBlock a) = UnsatBlock (comp a)
comp x = x
instance Compress JVal where
comp (JList xs) = JList (comp xs)
comp (JHash m) = JHash (M.map comp m)
comp (JFunc xs x) = JFunc xs (comp x)
comp (UnsatVal x) = UnsatVal (comp x)
comp x = x
instance Compress JExpr where
comp (SelExpr e (StrI i)) = IdxExpr (comp e) (ValExpr (JStr i)) -- Closure fix - advanced mode nukes these
comp (IdxExpr a b) = IdxExpr (comp a) (comp b)
comp (InfixExpr a b c) = InfixExpr a (comp b) (comp c)
comp (PPostExpr a b c) = PPostExpr a b (comp c)
comp (IfExpr a b c) = IfExpr (comp a) (comp b) (comp c)
comp (NewExpr a) = NewExpr (comp a)
comp (ApplExpr a b) = ApplExpr (comp a) (map comp b)
comp (TypeExpr a b c) = TypeExpr a (comp b) c
comp (ValExpr a) = ValExpr (comp a)
comp (UnsatExpr a) = UnsatExpr (comp a)
comp _ = error "Compression"
render :: Program -> String -> Program -> String
render (Program ys) src (Program xs) =
show . renderJs . comp . runJS src . toJS . map (empty_meta Library ys) $ xs
render_spec :: Program -> String -> Program -> String
render_spec (Program ys) src (Program xs) =
show . renderJs . wrap . runJS src . toJS . map (empty_meta Test ys) $ xs
where wrap x = [jmacro| describe("", function() { `(x)`; }); |]