{-# OPTIONS_HADDOCK hide #-} {-# LANGUAGE CPP #-} {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE UndecidableInstances #-} #ifdef ONLY_ONE_LANGUAGE module Cubix.Language.JavaScript.Parametric.Full.Trans () where #else module Cubix.Language.JavaScript.Parametric.Full.Trans ( translate , untranslate ) where import Data.Typeable ( Typeable ) import qualified Language.Haskell.TH as TH import qualified Language.JavaScript.Parser.AST as JS import Data.Comp.Multi ( Sum, All, caseCxt ) import Data.Comp.Trans ( runCompTrans, deriveTrans, deriveUntrans ) import Cubix.Language.JavaScript.Parametric.Full.Names import Cubix.Language.JavaScript.Parametric.Full.Types import Cubix.Language.Parametric.Syntax.Functor runCompTrans $ deriveTrans origASTTypes (TH.ConT ''JSTerm) translate :: JS.JSAST -> JSTerm JSASTL translate :: JSAST -> JSTerm JSASTL translate = JSAST -> JSTerm JSASTL forall a i. Trans a i => a -> JSTerm i trans instance (Trans c l) => Trans (JS.JSCommaList c) (JSCommaList l) where trans :: JSCommaList c -> JSTerm (JSCommaList l) trans (JS.JSLCons JSCommaList c a JSAnnot b c c) = JSTerm (JSCommaList l) -> JSTerm JSAnnotL -> Cxt NoHole (Sum JSSig) (K ()) l -> JSTerm (JSCommaList l) forall (f :: Fragment) h (a :: * -> *) l. (JSCommaListF :<: f) => Cxt h f a (JSCommaList l) -> Cxt h f a JSAnnotL -> Cxt h f a l -> Cxt h f a (JSCommaList l) riJSLCons (JSCommaList c -> JSTerm (JSCommaList l) forall a i. Trans a i => a -> JSTerm i trans JSCommaList c a) (JSAnnot -> JSTerm JSAnnotL forall a i. Trans a i => a -> JSTerm i trans JSAnnot b) (c -> Cxt NoHole (Sum JSSig) (K ()) l forall a i. Trans a i => a -> JSTerm i trans c c) trans (JS.JSLOne c a) = Cxt NoHole (Sum JSSig) (K ()) l -> JSTerm (JSCommaList l) forall (f :: Fragment) h (a :: * -> *) l. (JSCommaListF :<: f) => Cxt h f a l -> Cxt h f a (JSCommaList l) riJSLOne (c -> Cxt NoHole (Sum JSSig) (K ()) l forall a i. Trans a i => a -> JSTerm i trans c a) trans JSCommaList c JS.JSLNil = JSTerm (JSCommaList l) forall (f :: Fragment) h (a :: * -> *) l. (JSCommaListF :<: f) => Cxt h f a (JSCommaList l) riJSLNil instance (Trans c l, Trans (JS.JSCommaList c) (JSCommaList l)) => Trans (JS.JSCommaTrailingList c) (JSCommaTrailingList l) where trans :: JSCommaTrailingList c -> JSTerm (JSCommaTrailingList l) trans (JS.JSCTLComma JSCommaList c a JSAnnot b) = Cxt NoHole (Sum JSSig) (K ()) (JSCommaList l) -> JSTerm JSAnnotL -> JSTerm (JSCommaTrailingList l) forall (f :: Fragment) h (a :: * -> *) l. (JSCommaTrailingListF :<: f) => Cxt h f a (JSCommaList l) -> Cxt h f a JSAnnotL -> Cxt h f a (JSCommaTrailingList l) riJSCTLComma (JSCommaList c -> Cxt NoHole (Sum JSSig) (K ()) (JSCommaList l) forall a i. Trans a i => a -> JSTerm i trans JSCommaList c a) (JSAnnot -> JSTerm JSAnnotL forall a i. Trans a i => a -> JSTerm i trans JSAnnot b) trans (JS.JSCTLNone JSCommaList c a) = Cxt NoHole (Sum JSSig) (K ()) (JSCommaList l) -> JSTerm (JSCommaTrailingList l) forall (f :: Fragment) h (a :: * -> *) l. (JSCommaTrailingListF :<: f) => Cxt h f a (JSCommaList l) -> Cxt h f a (JSCommaTrailingList l) riJSCTLNone (JSCommaList c -> Cxt NoHole (Sum JSSig) (K ()) (JSCommaList l) forall a i. Trans a i => a -> JSTerm i trans JSCommaList c a) instance (Trans c l, Typeable l) => Trans [c] [l] where trans :: [c] -> JSTerm [l] trans [] = JSTerm [l] forall h (f :: Fragment) (a :: * -> *) l. (ListF :<: f, Typeable l) => Cxt h f a [l] riNilF trans (c x:[c] xs) = (c -> JSTerm l forall a i. Trans a i => a -> JSTerm i trans c x :: JSTerm l) JSTerm l -> JSTerm [l] -> JSTerm [l] forall (fs :: [Fragment]) l l' h (a :: * -> *). (ListF :-<: fs, InjF fs [l] l', Typeable l) => CxtS h fs a l -> CxtS h fs a [l] -> CxtS h fs a l' `iConsF` ([c] -> JSTerm [l] forall a i. Trans a i => a -> JSTerm i trans [c] xs) instance (Trans c l, Typeable l) => Trans (Maybe c) (Maybe l) where trans :: Maybe c -> JSTerm (Maybe l) trans Maybe c Nothing = JSTerm (Maybe l) forall h (f :: Fragment) (a :: * -> *) l. (MaybeF :<: f, Typeable l) => Cxt h f a (Maybe l) riNothingF trans (Just c x) = CxtS NoHole JSSig (K ()) l -> JSTerm (Maybe l) forall (fs :: [Fragment]) l l' h (a :: * -> *). (MaybeF :-<: fs, InjF fs (Maybe l) l', Typeable l) => CxtS h fs a l -> CxtS h fs a l' iJustF (CxtS NoHole JSSig (K ()) l -> JSTerm (Maybe l)) -> CxtS NoHole JSSig (K ()) l -> JSTerm (Maybe l) forall a b. (a -> b) -> a -> b $ (c -> CxtS NoHole JSSig (K ()) l forall a i. Trans a i => a -> JSTerm i trans c x :: JSTerm l) runCompTrans $ deriveUntrans origASTTypes (TH.ConT ''JSTerm) type instance Targ (JSCommaList l) = JS.JSCommaList (Targ l) instance Untrans JSCommaListF where untrans :: Alg JSCommaListF T untrans (JSLCons T (JSCommaList l1) a T JSAnnotL b T l1 c) = Targ i -> T i forall i. Targ i -> T i T (Targ i -> T i) -> Targ i -> T i forall a b. (a -> b) -> a -> b $ JSCommaList (Targ l1) -> JSAnnot -> Targ l1 -> JSCommaList (Targ l1) forall a. JSCommaList a -> JSAnnot -> a -> JSCommaList a JS.JSLCons (T (JSCommaList l1) -> Targ (JSCommaList l1) forall i. T i -> Targ i t T (JSCommaList l1) a) (T JSAnnotL -> Targ JSAnnotL forall i. T i -> Targ i t T JSAnnotL b) (T l1 -> Targ l1 forall i. T i -> Targ i t T l1 c) untrans (JSLOne T l1 a) = Targ i -> T i forall i. Targ i -> T i T (Targ i -> T i) -> Targ i -> T i forall a b. (a -> b) -> a -> b $ Targ l1 -> JSCommaList (Targ l1) forall a. a -> JSCommaList a JS.JSLOne (T l1 -> Targ l1 forall i. T i -> Targ i t T l1 a) untrans JSCommaListF T i JSLNil = Targ i -> T i forall i. Targ i -> T i T (Targ i -> T i) -> Targ i -> T i forall a b. (a -> b) -> a -> b $ JSCommaList (Targ t) Targ i forall a. JSCommaList a JS.JSLNil type instance Targ (JSCommaTrailingList l) = JS.JSCommaTrailingList (Targ l) instance Untrans JSCommaTrailingListF where untrans :: Alg JSCommaTrailingListF T untrans (JSCTLComma T (JSCommaList l1) a T JSAnnotL b) = Targ i -> T i forall i. Targ i -> T i T (Targ i -> T i) -> Targ i -> T i forall a b. (a -> b) -> a -> b $ JSCommaList (Targ l1) -> JSAnnot -> JSCommaTrailingList (Targ l1) forall a. JSCommaList a -> JSAnnot -> JSCommaTrailingList a JS.JSCTLComma (T (JSCommaList l1) -> Targ (JSCommaList l1) forall i. T i -> Targ i t T (JSCommaList l1) a) (T JSAnnotL -> Targ JSAnnotL forall i. T i -> Targ i t T JSAnnotL b) untrans (JSCTLNone T (JSCommaList l1) a) = Targ i -> T i forall i. Targ i -> T i T (Targ i -> T i) -> Targ i -> T i forall a b. (a -> b) -> a -> b $ JSCommaList (Targ l1) -> JSCommaTrailingList (Targ l1) forall a. JSCommaList a -> JSCommaTrailingList a JS.JSCTLNone (T (JSCommaList l1) -> Targ (JSCommaList l1) forall i. T i -> Targ i t T (JSCommaList l1) a) type instance Targ [l] = [Targ l] instance Untrans ListF where untrans :: Alg ListF T untrans ListF T i NilF = Targ i -> T i forall i. Targ i -> T i T [] untrans (ConsF T l1 a T [l1] b) = Targ i -> T i forall i. Targ i -> T i T ((T l1 -> Targ l1 forall i. T i -> Targ i t T l1 a) Targ l1 -> [Targ l1] -> [Targ l1] forall a. a -> [a] -> [a] : (T [l1] -> Targ [l1] forall i. T i -> Targ i t T [l1] b)) type instance Targ (Maybe l) = Maybe (Targ l) instance Untrans MaybeF where untrans :: Alg MaybeF T untrans MaybeF T i NothingF = Targ i -> T i forall i. Targ i -> T i T Maybe (Targ l1) Targ i forall a. Maybe a Nothing untrans (JustF T l1 x) = Targ i -> T i forall i. Targ i -> T i T (Targ l1 -> Maybe (Targ l1) forall a. a -> Maybe a Just (T l1 -> Targ l1 forall i. T i -> Targ i t T l1 x)) instance (All Untrans fs) => Untrans (Sum fs) where untrans :: Alg (Sum fs) T untrans = forall (cxt :: Fragment -> Constraint) (fs :: [Fragment]) (a :: * -> *) e b. All cxt fs => (forall (f :: Fragment). cxt f => f a e -> b) -> Sum fs a e -> b caseCxt @Untrans f T i -> T i Alg f T forall (f :: Fragment). Untrans f => f T i -> T i forall (f :: Fragment). Untrans f => Alg f T untrans #endif