{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PartialTypeSignatures #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ViewPatterns #-}

module Cubix.Language.JavaScript.Parametric.Common.Semantics () where

#ifndef ONLY_ONE_LANGUAGE
import Control.Monad ( liftM )

import Data.Maybe ( fromJust )
import Data.Proxy ( Proxy(..) )
import Data.Type.Equality ( (:~:)(..), gcastWith )

import Data.Comp.Multi ( project, project', inject', Cxt(..), appCxt, AnnTerm, (:-<:), ContextS )
import Data.Comp.Multi.Strategy.Classification ( KDynCase(..), kIsSort, dynProj )

import Cubix.Language.JavaScript.Parametric.Common.Types
import Cubix.Language.JavaScript.Parametric.Full
import Cubix.Language.Parametric.Semantics.SemanticProperties
import Cubix.Language.Parametric.Syntax

import Cubix.Sin.Compdata.Annotation ( annM, annotateM )

import Unsafe.Coerce ( unsafeCoerce )

instance {-# OVERLAPPING #-} (JSBinOp :-<: gs) => GetStrictness' gs JSExpression where
  getStrictness' :: JSExpression (Term gs) l -> [Strictness]
getStrictness' (JSExpressionTernary _ _ _ _ _) = [Strictness
Strict, Strictness
NoEval, Place -> Strictness
GuardedBy (Int -> Place
Place 0), Strictness
NoEval, Place -> Strictness
GuardedBy (Int -> Place
NegPlace 0)]
  getStrictness' t :: JSExpression (Term gs) l
t@(JSExpressionBinary _ op :: Term gs JSBinOpL
op _)   = case Term gs JSBinOpL -> Maybe (JSBinOp (Term gs) JSBinOpL)
forall (g :: (* -> *) -> * -> *) (f :: (* -> *) -> * -> *) h
       (a :: * -> *).
(g :<: f) =>
NatM Maybe (Cxt h f a) (g (Cxt h f a))
project Term gs JSBinOpL
op of
    Just (JSBinOpAnd _) -> [Strictness
Strict, Strictness
NoEval, Place -> Strictness
GuardedBy (Int -> Place
Place 0)]
    Just (JSBinOpOr _)  -> [Strictness
Strict, Strictness
NoEval, Place -> Strictness
GuardedBy (Int -> Place
NegPlace 0)]
    _           -> JSExpression (Term gs) l -> [Strictness]
forall (f :: (* -> *) -> * -> *) (e :: * -> *) l.
HFoldable f =>
f e l -> [Strictness]
defaultGetStrictness JSExpression (Term gs) l
t
  getStrictness' x :: JSExpression (Term gs) l
x                  = JSExpression (Term gs) l -> [Strictness]
forall (f :: (* -> *) -> * -> *) (e :: * -> *) l.
HFoldable f =>
f e l -> [Strictness]
defaultGetStrictness JSExpression (Term gs) l
x

-- We can insert statements before list of statements, *or* before lists of BlockItem's
-- JS has both because scoping
instance {-# OVERLAPPING #-} InsertAt' MJSSig JSStatementL ListF where
  insertAt' :: NodeEvaluationPoint
-> AnnTerm a MJSSig JSStatementL
-> (:&:) ListF a (AnnTerm a MJSSig) i
-> m (AnnTerm a MJSSig i)
insertAt' EnterEvalPoint e :: AnnTerm a MJSSig JSStatementL
e t :: (:&:) ListF a (AnnTerm a MJSSig) i
t =
        case (:&:) ListF a (AnnTerm a MJSSig) i -> Maybe (i :~: [JSStatementL])
forall (f :: (* -> *) -> * -> *) a (e :: * -> *) b.
KDynCase f a =>
f e b -> Maybe (b :~: a)
kdyncase (:&:) ListF a (AnnTerm a MJSSig) i
t :: Maybe (_ :~: [JSStatementL]) of
            Just p :: i :~: [JSStatementL]
p  -> (i :~: [JSStatementL])
-> ((i ~ [JSStatementL]) => m (AnnTerm a MJSSig i))
-> m (AnnTerm a MJSSig i)
forall k (a :: k) (b :: k) r. (a :~: b) -> ((a ~ b) => r) -> r
gcastWith i :~: [JSStatementL]
p (((i ~ [JSStatementL]) => m (AnnTerm a MJSSig i))
 -> m (AnnTerm a MJSSig i))
-> ((i ~ [JSStatementL]) => m (AnnTerm a MJSSig i))
-> m (AnnTerm a MJSSig i)
forall a b. (a -> b) -> a -> b
$ (:&:) ListF a (AnnTerm a MJSSig) [JSStatementL]
-> Cxt NoHole (Sum MJSSig :&: a) (K ()) [JSStatementL]
forall (f :: (* -> *) -> * -> *) (g :: (* -> *) -> * -> *) p h
       (a :: * -> *).
(f :<: g) =>
(:&:) f p (Cxt h (g :&: p) a) :-> Cxt h (g :&: p) a
inject' ((:&:) ListF a (AnnTerm a MJSSig) [JSStatementL]
 -> Cxt NoHole (Sum MJSSig :&: a) (K ()) [JSStatementL])
-> m ((:&:) ListF a (AnnTerm a MJSSig) [JSStatementL])
-> m (Cxt NoHole (Sum MJSSig :&: a) (K ()) [JSStatementL])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ListF (AnnTerm a MJSSig) [JSStatementL]
-> m ((:&:) ListF a (AnnTerm a MJSSig) [JSStatementL])
forall a (m :: * -> *) (f :: (* -> *) -> * -> *) (e :: * -> *) l.
MonadAnnotater a m =>
f e l -> m ((:&:) f a e l)
annM (AnnTerm a MJSSig JSStatementL
-> Cxt NoHole (Sum MJSSig :&: a) (K ()) [JSStatementL]
-> ListF (AnnTerm a MJSSig) [JSStatementL]
forall l (e :: * -> *). Typeable l => e l -> e [l] -> ListF e [l]
ConsF AnnTerm a MJSSig JSStatementL
e ((:&:) ListF a (AnnTerm a MJSSig) i -> AnnTerm a MJSSig i
forall (f :: (* -> *) -> * -> *) (g :: (* -> *) -> * -> *) p h
       (a :: * -> *).
(f :<: g) =>
(:&:) f p (Cxt h (g :&: p) a) :-> Cxt h (g :&: p) a
inject' (:&:) ListF a (AnnTerm a MJSSig) i
t))
            Nothing -> case (:&:) ListF a (AnnTerm a MJSSig) i -> Maybe (i :~: [BlockItemL])
forall (f :: (* -> *) -> * -> *) a (e :: * -> *) b.
KDynCase f a =>
f e b -> Maybe (b :~: a)
kdyncase (:&:) ListF a (AnnTerm a MJSSig) i
t :: (Maybe (_ :~: [BlockItemL])) of
                           Nothing -> AnnTerm a MJSSig i -> m (AnnTerm a MJSSig i)
forall (m :: * -> *) a. Monad m => a -> m a
return (AnnTerm a MJSSig i -> m (AnnTerm a MJSSig i))
-> AnnTerm a MJSSig i -> m (AnnTerm a MJSSig i)
forall a b. (a -> b) -> a -> b
$ (:&:) ListF a (AnnTerm a MJSSig) i -> AnnTerm a MJSSig i
forall (f :: (* -> *) -> * -> *) (g :: (* -> *) -> * -> *) p h
       (a :: * -> *).
(f :<: g) =>
(:&:) f p (Cxt h (g :&: p) a) :-> Cxt h (g :&: p) a
inject' (:&:) ListF a (AnnTerm a MJSSig) i
t
                           Just p :: i :~: [BlockItemL]
p  ->
                             (i :~: [BlockItemL])
-> ((i ~ [BlockItemL]) => m (AnnTerm a MJSSig i))
-> m (AnnTerm a MJSSig i)
forall k (a :: k) (b :: k) r. (a :~: b) -> ((a ~ b) => r) -> r
gcastWith i :~: [BlockItemL]
p (((i ~ [BlockItemL]) => m (AnnTerm a MJSSig i))
 -> m (AnnTerm a MJSSig i))
-> ((i ~ [BlockItemL]) => m (AnnTerm a MJSSig i))
-> m (AnnTerm a MJSSig i)
forall a b. (a -> b) -> a -> b
$ ((:&:) ListF a (AnnTerm a MJSSig) [BlockItemL]
 -> Cxt NoHole (Sum MJSSig :&: a) (K ()) [BlockItemL])
-> m ((:&:) ListF a (AnnTerm a MJSSig) [BlockItemL])
-> m (Cxt NoHole (Sum MJSSig :&: a) (K ()) [BlockItemL])
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (:&:) ListF a (AnnTerm a MJSSig) [BlockItemL]
-> Cxt NoHole (Sum MJSSig :&: a) (K ()) [BlockItemL]
forall (f :: (* -> *) -> * -> *) (g :: (* -> *) -> * -> *) p h
       (a :: * -> *).
(f :<: g) =>
(:&:) f p (Cxt h (g :&: p) a) :-> Cxt h (g :&: p) a
inject' (m ((:&:) ListF a (AnnTerm a MJSSig) [BlockItemL])
 -> m (AnnTerm a MJSSig i))
-> m ((:&:) ListF a (AnnTerm a MJSSig) [BlockItemL])
-> m (AnnTerm a MJSSig i)
forall a b. (a -> b) -> a -> b
$ ListF (AnnTerm a MJSSig) [BlockItemL]
-> m ((:&:) ListF a (AnnTerm a MJSSig) [BlockItemL])
forall a (m :: * -> *) (f :: (* -> *) -> * -> *) (e :: * -> *) l.
MonadAnnotater a m =>
f e l -> m ((:&:) f a e l)
annM (ListF (AnnTerm a MJSSig) [BlockItemL]
 -> m ((:&:) ListF a (AnnTerm a MJSSig) [BlockItemL]))
-> m (ListF (AnnTerm a MJSSig) [BlockItemL])
-> m ((:&:) ListF a (AnnTerm a MJSSig) [BlockItemL])
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< (Cxt NoHole (Sum MJSSig :&: a) (K ()) BlockItemL
-> Cxt NoHole (Sum MJSSig :&: a) (K ()) [BlockItemL]
-> ListF (AnnTerm a MJSSig) [BlockItemL]
forall l (e :: * -> *). Typeable l => e l -> e [l] -> ListF e [l]
ConsF (Cxt NoHole (Sum MJSSig :&: a) (K ()) BlockItemL
 -> Cxt NoHole (Sum MJSSig :&: a) (K ()) [BlockItemL]
 -> ListF (AnnTerm a MJSSig) [BlockItemL])
-> m (Cxt NoHole (Sum MJSSig :&: a) (K ()) BlockItemL)
-> m (Cxt NoHole (Sum MJSSig :&: a) (K ()) [BlockItemL]
      -> ListF (AnnTerm a MJSSig) [BlockItemL])
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ((:&:) JSStatementIsBlockItem a (AnnTerm a MJSSig) BlockItemL
-> Cxt NoHole (Sum MJSSig :&: a) (K ()) BlockItemL
forall (f :: (* -> *) -> * -> *) (g :: (* -> *) -> * -> *) p h
       (a :: * -> *).
(f :<: g) =>
(:&:) f p (Cxt h (g :&: p) a) :-> Cxt h (g :&: p) a
inject' ((:&:) JSStatementIsBlockItem a (AnnTerm a MJSSig) BlockItemL
 -> Cxt NoHole (Sum MJSSig :&: a) (K ()) BlockItemL)
-> m ((:&:) JSStatementIsBlockItem a (AnnTerm a MJSSig) BlockItemL)
-> m (Cxt NoHole (Sum MJSSig :&: a) (K ()) BlockItemL)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (JSStatementIsBlockItem (AnnTerm a MJSSig) BlockItemL
-> m ((:&:) JSStatementIsBlockItem a (AnnTerm a MJSSig) BlockItemL)
forall a (m :: * -> *) (f :: (* -> *) -> * -> *) (e :: * -> *) l.
MonadAnnotater a m =>
f e l -> m ((:&:) f a e l)
annM (JSStatementIsBlockItem (AnnTerm a MJSSig) BlockItemL
 -> m ((:&:)
         JSStatementIsBlockItem a (AnnTerm a MJSSig) BlockItemL))
-> JSStatementIsBlockItem (AnnTerm a MJSSig) BlockItemL
-> m ((:&:) JSStatementIsBlockItem a (AnnTerm a MJSSig) BlockItemL)
forall a b. (a -> b) -> a -> b
$ AnnTerm a MJSSig JSStatementL
-> JSStatementIsBlockItem (AnnTerm a MJSSig) BlockItemL
forall (e :: * -> *) i.
(i ~ BlockItemL) =>
e JSStatementL -> JSStatementIsBlockItem e i
JSStatementIsBlockItem AnnTerm a MJSSig JSStatementL
e)) m (Cxt NoHole (Sum MJSSig :&: a) (K ()) [BlockItemL]
   -> ListF (AnnTerm a MJSSig) [BlockItemL])
-> m (Cxt NoHole (Sum MJSSig :&: a) (K ()) [BlockItemL])
-> m (ListF (AnnTerm a MJSSig) [BlockItemL])
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> AnnTerm a MJSSig i -> m (AnnTerm a MJSSig i)
forall (m :: * -> *) a. Monad m => a -> m a
return ((:&:) ListF a (AnnTerm a MJSSig) i -> AnnTerm a MJSSig i
forall (f :: (* -> *) -> * -> *) (g :: (* -> *) -> * -> *) p h
       (a :: * -> *).
(f :<: g) =>
(:&:) f p (Cxt h (g :&: p) a) :-> Cxt h (g :&: p) a
inject' (:&:) ListF a (AnnTerm a MJSSig) i
t))
  insertAt' _ _ t :: (:&:) ListF a (AnnTerm a MJSSig) i
t = AnnTerm a MJSSig i -> m (AnnTerm a MJSSig i)
forall (m :: * -> *) a. Monad m => a -> m a
return (AnnTerm a MJSSig i -> m (AnnTerm a MJSSig i))
-> AnnTerm a MJSSig i -> m (AnnTerm a MJSSig i)
forall a b. (a -> b) -> a -> b
$ (:&:) ListF a (AnnTerm a MJSSig) i -> AnnTerm a MJSSig i
forall (f :: (* -> *) -> * -> *) (g :: (* -> *) -> * -> *) p h
       (a :: * -> *).
(f :<: g) =>
(:&:) f p (Cxt h (g :&: p) a) :-> Cxt h (g :&: p) a
inject' (:&:) ListF a (AnnTerm a MJSSig) i
t

  canInsertAt' :: NodeEvaluationPoint
-> Proxy JSStatementL -> (:&:) ListF a (AnnTerm a MJSSig) i -> Bool
canInsertAt' EnterEvalPoint _ t :: (:&:) ListF a (AnnTerm a MJSSig) i
t =     Proxy [JSStatementL] -> (:&:) ListF a (AnnTerm a MJSSig) i -> Bool
forall (f :: (* -> *) -> * -> *) l.
KDynCase f l =>
Proxy l -> forall i (e :: * -> *). f e i -> Bool
kIsSort (Proxy [JSStatementL]
forall k (t :: k). Proxy t
Proxy :: Proxy [JSStatementL]) (:&:) ListF a (AnnTerm a MJSSig) i
t
                                     Bool -> Bool -> Bool
|| Proxy [BlockItemL] -> (:&:) ListF a (AnnTerm a MJSSig) i -> Bool
forall (f :: (* -> *) -> * -> *) l.
KDynCase f l =>
Proxy l -> forall i (e :: * -> *). f e i -> Bool
kIsSort (Proxy [BlockItemL]
forall k (t :: k). Proxy t
Proxy :: Proxy [BlockItemL]) (:&:) ListF a (AnnTerm a MJSSig) i
t
  canInsertAt' _              _ _ = Bool
False

-- And here's inserting a block item into a list of statements/block items
instance {-# OVERLAPPING #-} InsertAt' MJSSig BlockItemL ListF where
  insertAt' :: NodeEvaluationPoint
-> AnnTerm a MJSSig BlockItemL
-> (:&:) ListF a (AnnTerm a MJSSig) i
-> m (AnnTerm a MJSSig i)
insertAt' p :: NodeEvaluationPoint
p (AnnTerm a MJSSig BlockItemL
-> Maybe (JSStatementIsBlockItem (AnnTerm a MJSSig) BlockItemL)
forall (f :: (* -> *) -> * -> *) (f' :: (* -> *) -> * -> *)
       (s :: (* -> *) -> * -> *) h (a :: * -> *) i.
(RemA f f', s :<: f') =>
Cxt h f a i -> Maybe (s (Cxt h f a) i)
project' -> Just (JSStatementIsBlockItem s :: Cxt NoHole (Sum MJSSig :&: a) (K ()) JSStatementL
s)) t :: (:&:) ListF a (AnnTerm a MJSSig) i
t = NodeEvaluationPoint
-> Cxt NoHole (Sum MJSSig :&: a) (K ()) JSStatementL
-> (:&:) ListF a (AnnTerm a MJSSig) i
-> m (AnnTerm a MJSSig i)
forall (gs :: [(* -> *) -> * -> *]) l (f :: (* -> *) -> * -> *) a
       (m :: * -> *) i.
(InsertAt' gs l f, MonadAnnotater a m) =>
NodeEvaluationPoint
-> AnnTerm a gs l
-> (:&:) f a (AnnTerm a gs) i
-> m (AnnTerm a gs i)
insertAt' NodeEvaluationPoint
p Cxt NoHole (Sum MJSSig :&: a) (K ()) JSStatementL
s (:&:) ListF a (AnnTerm a MJSSig) i
t

  canInsertAt' :: NodeEvaluationPoint
-> Proxy BlockItemL -> (:&:) ListF a (AnnTerm a MJSSig) i -> Bool
canInsertAt' p :: NodeEvaluationPoint
p  _ t :: (:&:) ListF a (AnnTerm a MJSSig) i
t = NodeEvaluationPoint
-> Proxy JSStatementL -> (:&:) ListF a (AnnTerm a MJSSig) i -> Bool
forall (gs :: [(* -> *) -> * -> *]) l (f :: (* -> *) -> * -> *) a
       i.
InsertAt' gs l f =>
NodeEvaluationPoint
-> Proxy l -> (:&:) f a (AnnTerm a gs) i -> Bool
canInsertAt' NodeEvaluationPoint
p (Proxy JSStatementL
forall k (t :: k). Proxy t
Proxy :: Proxy JSStatementL) (:&:) ListF a (AnnTerm a MJSSig) i
t


instance {-# OVERLAPPING #-} InsertAt' MJSSig JSStatementL JSStatement where
  insertAt' :: NodeEvaluationPoint
-> AnnTerm a MJSSig JSStatementL
-> (:&:) JSStatement a (AnnTerm a MJSSig) i
-> m (AnnTerm a MJSSig i)
insertAt' EnterEvalPoint t :: AnnTerm a MJSSig JSStatementL
t s :: (:&:) JSStatement a (AnnTerm a MJSSig) i
s = (AnnTerm a MJSSig JSStatementL -> AnnTerm a MJSSig i)
-> m (AnnTerm a MJSSig JSStatementL) -> m (AnnTerm a MJSSig i)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM AnnTerm a MJSSig JSStatementL -> AnnTerm a MJSSig i
forall a i j. AnnTerm a MJSSig i -> AnnTerm a MJSSig j
convertTerm (m (AnnTerm a MJSSig JSStatementL) -> m (AnnTerm a MJSSig i))
-> m (AnnTerm a MJSSig JSStatementL) -> m (AnnTerm a MJSSig i)
forall a b. (a -> b) -> a -> b
$ (Context (Sum MJSSig :&: a) (AnnTerm a MJSSig) JSStatementL
 -> AnnTerm a MJSSig JSStatementL)
-> m (Context (Sum MJSSig :&: a) (AnnTerm a MJSSig) JSStatementL)
-> m (AnnTerm a MJSSig JSStatementL)
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Context (Sum MJSSig :&: a) (AnnTerm a MJSSig) JSStatementL
-> AnnTerm a MJSSig JSStatementL
forall (f :: (* -> *) -> * -> *) h (a :: * -> *).
HFunctor f =>
Context f (Cxt h f a) :-> Cxt h f a
appCxt (m (Context (Sum MJSSig :&: a) (AnnTerm a MJSSig) JSStatementL)
 -> m (AnnTerm a MJSSig JSStatementL))
-> m (Context (Sum MJSSig :&: a) (AnnTerm a MJSSig) JSStatementL)
-> m (AnnTerm a MJSSig JSStatementL)
forall a b. (a -> b) -> a -> b
$ Cxt Hole (Sum MJSSig) (AnnTerm a MJSSig) JSStatementL
-> m (Context (Sum MJSSig :&: a) (AnnTerm a MJSSig) JSStatementL)
forall (f :: (* -> *) -> * -> *) a (m :: * -> *).
(HTraversable f, MonadAnnotater a m) =>
CxtFunM m f (f :&: a)
annotateM Cxt Hole (Sum MJSSig) (AnnTerm a MJSSig) JSStatementL
e
    where
      e :: ContextS MJSSig (AnnTerm _ MJSSig) JSStatementL
      e :: Cxt Hole (Sum MJSSig) (AnnTerm a MJSSig) JSStatementL
e = CxtS Hole MJSSig (AnnTerm a MJSSig) JSAnnotL
-> CxtS Hole MJSSig (AnnTerm a MJSSig) [JSStatementL]
-> CxtS Hole MJSSig (AnnTerm a MJSSig) JSAnnotL
-> CxtS Hole MJSSig (AnnTerm a MJSSig) JSSemiL
-> Cxt Hole (Sum MJSSig) (AnnTerm a MJSSig) JSStatementL
forall h (fs :: [(* -> *) -> * -> *]) (a :: * -> *) j.
(JSStatement :-<: fs, InjF fs JSStatementL j) =>
CxtS h fs a JSAnnotL
-> CxtS h fs a [JSStatementL]
-> CxtS h fs a JSAnnotL
-> CxtS h fs a JSSemiL
-> CxtS h fs a j
iJSStatementBlock CxtS Hole MJSSig (AnnTerm a MJSSig) JSAnnotL
forall h (fs :: [(* -> *) -> * -> *]) (a :: * -> *) j.
(JSAnnot :-<: fs, InjF fs JSAnnotL j) =>
CxtS h fs a j
iJSNoAnnot ([Cxt Hole (Sum MJSSig) (AnnTerm a MJSSig) JSStatementL]
-> CxtS Hole MJSSig (AnnTerm a MJSSig) [JSStatementL]
forall (f :: * -> *) (e :: * -> *) l.
(InsertF f e, Typeable l) =>
f (e l) -> e (f l)
insertF [AnnTerm a MJSSig JSStatementL
-> Cxt Hole (Sum MJSSig) (AnnTerm a MJSSig) JSStatementL
forall (a :: * -> *) i (f :: (* -> *) -> * -> *).
a i -> Cxt Hole f a i
Hole AnnTerm a MJSSig JSStatementL
t, (AnnTerm a MJSSig JSStatementL
-> Cxt Hole (Sum MJSSig) (AnnTerm a MJSSig) JSStatementL
forall (a :: * -> *) i (f :: (* -> *) -> * -> *).
a i -> Cxt Hole f a i
Hole (AnnTerm a MJSSig JSStatementL
 -> Cxt Hole (Sum MJSSig) (AnnTerm a MJSSig) JSStatementL)
-> AnnTerm a MJSSig JSStatementL
-> Cxt Hole (Sum MJSSig) (AnnTerm a MJSSig) JSStatementL
forall a b. (a -> b) -> a -> b
$ Maybe (AnnTerm a MJSSig JSStatementL)
-> AnnTerm a MJSSig JSStatementL
forall a. HasCallStack => Maybe a -> a
fromJust (Maybe (AnnTerm a MJSSig JSStatementL)
 -> AnnTerm a MJSSig JSStatementL)
-> Maybe (AnnTerm a MJSSig JSStatementL)
-> AnnTerm a MJSSig JSStatementL
forall a b. (a -> b) -> a -> b
$ AnnTerm a MJSSig i -> Maybe (AnnTerm a MJSSig JSStatementL)
forall (f :: * -> *) l l'. DynCase f l => f l' -> Maybe (f l)
dynProj (AnnTerm a MJSSig i -> Maybe (AnnTerm a MJSSig JSStatementL))
-> AnnTerm a MJSSig i -> Maybe (AnnTerm a MJSSig JSStatementL)
forall a b. (a -> b) -> a -> b
$ (:&:) JSStatement a (AnnTerm a MJSSig) i -> AnnTerm a MJSSig i
forall (f :: (* -> *) -> * -> *) (g :: (* -> *) -> * -> *) p h
       (a :: * -> *).
(f :<: g) =>
(:&:) f p (Cxt h (g :&: p) a) :-> Cxt h (g :&: p) a
inject' (:&:) JSStatement a (AnnTerm a MJSSig) i
s) :: ContextS MJSSig _ JSStatementL]) CxtS Hole MJSSig (AnnTerm a MJSSig) JSAnnotL
forall h (fs :: [(* -> *) -> * -> *]) (a :: * -> *) j.
(JSAnnot :-<: fs, InjF fs JSAnnotL j) =>
CxtS h fs a j
iJSNoAnnot CxtS Hole MJSSig (AnnTerm a MJSSig) JSSemiL
forall h (fs :: [(* -> *) -> * -> *]) (a :: * -> *) j.
(JSSemi :-<: fs, InjF fs JSSemiL j) =>
CxtS h fs a j
iJSSemiAuto

      convertTerm :: AnnTerm a MJSSig i -> AnnTerm a MJSSig j
      convertTerm :: AnnTerm a MJSSig i -> AnnTerm a MJSSig j
convertTerm = AnnTerm a MJSSig i -> AnnTerm a MJSSig j
forall a b. a -> b
unsafeCoerce
  insertAt' _ _ s :: (:&:) JSStatement a (AnnTerm a MJSSig) i
s = AnnTerm a MJSSig i -> m (AnnTerm a MJSSig i)
forall (m :: * -> *) a. Monad m => a -> m a
return (AnnTerm a MJSSig i -> m (AnnTerm a MJSSig i))
-> AnnTerm a MJSSig i -> m (AnnTerm a MJSSig i)
forall a b. (a -> b) -> a -> b
$ (:&:) JSStatement a (AnnTerm a MJSSig) i -> AnnTerm a MJSSig i
forall (f :: (* -> *) -> * -> *) (g :: (* -> *) -> * -> *) p h
       (a :: * -> *).
(f :<: g) =>
(:&:) f p (Cxt h (g :&: p) a) :-> Cxt h (g :&: p) a
inject' (:&:) JSStatement a (AnnTerm a MJSSig) i
s

  canInsertAt' :: NodeEvaluationPoint
-> Proxy JSStatementL
-> (:&:) JSStatement a (AnnTerm a MJSSig) i
-> Bool
canInsertAt' EnterEvalPoint _ _ = Bool
True
  canInsertAt' _              _ _ = Bool
False

instance {-# OVERLAPPING #-} InsertAt' MJSSig BlockItemL JSStatement where
  insertAt' :: NodeEvaluationPoint
-> AnnTerm a MJSSig BlockItemL
-> (:&:) JSStatement a (AnnTerm a MJSSig) i
-> m (AnnTerm a MJSSig i)
insertAt' p :: NodeEvaluationPoint
p (AnnTerm a MJSSig BlockItemL
-> Maybe (JSStatementIsBlockItem (AnnTerm a MJSSig) BlockItemL)
forall (f :: (* -> *) -> * -> *) (f' :: (* -> *) -> * -> *)
       (s :: (* -> *) -> * -> *) h (a :: * -> *) i.
(RemA f f', s :<: f') =>
Cxt h f a i -> Maybe (s (Cxt h f a) i)
project' -> Just (JSStatementIsBlockItem s :: Cxt NoHole (Sum MJSSig :&: a) (K ()) JSStatementL
s)) t :: (:&:) JSStatement a (AnnTerm a MJSSig) i
t = NodeEvaluationPoint
-> Cxt NoHole (Sum MJSSig :&: a) (K ()) JSStatementL
-> (:&:) JSStatement a (AnnTerm a MJSSig) i
-> m (AnnTerm a MJSSig i)
forall (gs :: [(* -> *) -> * -> *]) l (f :: (* -> *) -> * -> *) a
       (m :: * -> *) i.
(InsertAt' gs l f, MonadAnnotater a m) =>
NodeEvaluationPoint
-> AnnTerm a gs l
-> (:&:) f a (AnnTerm a gs) i
-> m (AnnTerm a gs i)
insertAt' NodeEvaluationPoint
p Cxt NoHole (Sum MJSSig :&: a) (K ()) JSStatementL
s (:&:) JSStatement a (AnnTerm a MJSSig) i
t

  canInsertAt' :: NodeEvaluationPoint
-> Proxy BlockItemL
-> (:&:) JSStatement a (AnnTerm a MJSSig) i
-> Bool
canInsertAt' p :: NodeEvaluationPoint
p  _ t :: (:&:) JSStatement a (AnnTerm a MJSSig) i
t = NodeEvaluationPoint
-> Proxy JSStatementL
-> (:&:) JSStatement a (AnnTerm a MJSSig) i
-> Bool
forall (gs :: [(* -> *) -> * -> *]) l (f :: (* -> *) -> * -> *) a
       i.
InsertAt' gs l f =>
NodeEvaluationPoint
-> Proxy l -> (:&:) f a (AnnTerm a gs) i -> Bool
canInsertAt' NodeEvaluationPoint
p (Proxy JSStatementL
forall k (t :: k). Proxy t
Proxy :: Proxy JSStatementL) (:&:) JSStatement a (AnnTerm a MJSSig) i
t

#endif