{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE ViewPatterns #-}

module Cubix.Language.Python.Parametric.Common.Cfg () where

#ifndef ONLY_ONE_LANGUAGE
import Control.Monad ( liftM, liftM2 )
import Control.Monad.State ( MonadState )

import Control.Lens ( (%=), makeLenses )

import Data.Traversable ( for )

import Data.Comp.Multi ( (:*:)(..), remA, stripA, project )

import Cubix.Language.Info

import Cubix.Language.Python.Parametric.Common.Types as C
import Cubix.Language.Python.Parametric.Full.Types as F
import Cubix.Language.Parametric.Semantics.Cfg
import Cubix.Language.Parametric.Semantics.SemanticProperties
import Cubix.Language.Parametric.Syntax as P

data PythonCfgState = PythonCfgState {
                   PythonCfgState -> Cfg MPythonSig
_pcs_cfg       :: Cfg MPythonSig
                 , PythonCfgState -> LabelGen
_pcs_labeler   :: LabelGen
                 , PythonCfgState -> LoopStack
_pcs_stack     :: LoopStack
                 , PythonCfgState -> LabelMap
_pcs_goto_labs :: LabelMap
                 }

makeLenses ''PythonCfgState

instance HasCurCfg PythonCfgState MPythonSig where cur_cfg :: (Cfg MPythonSig -> f (Cfg MPythonSig))
-> PythonCfgState -> f PythonCfgState
cur_cfg = (Cfg MPythonSig -> f (Cfg MPythonSig))
-> PythonCfgState -> f PythonCfgState
Lens' PythonCfgState (Cfg MPythonSig)
pcs_cfg
instance HasLabelGen PythonCfgState where labelGen :: (LabelGen -> f LabelGen) -> PythonCfgState -> f PythonCfgState
labelGen = (LabelGen -> f LabelGen) -> PythonCfgState -> f PythonCfgState
Lens' PythonCfgState LabelGen
pcs_labeler
instance HasLoopStack PythonCfgState where loopStack :: (LoopStack -> f LoopStack) -> PythonCfgState -> f PythonCfgState
loopStack = (LoopStack -> f LoopStack) -> PythonCfgState -> f PythonCfgState
Lens' PythonCfgState LoopStack
pcs_stack
instance HasLabelMap PythonCfgState where labelMap :: (LabelMap -> f LabelMap) -> PythonCfgState -> f PythonCfgState
labelMap = (LabelMap -> f LabelMap) -> PythonCfgState -> f PythonCfgState
Lens' PythonCfgState LabelMap
pcs_goto_labs


type instance ComputationSorts MPythonSig = '[StatementL, ExprL, [BlockItemL], [StatementL]]

type instance SuspendedComputationSorts MPythonSig = '[]
type instance ContainerFunctors MPythonSig = '[PairF, ListF, MaybeF]
type instance CfgState MPythonSig = PythonCfgState


singleton :: a -> [a]
singleton :: a -> [a]
singleton = a -> [a]
forall (m :: * -> *) a. Monad m => a -> m a
return

constructCfgWhileElse ::
  ( HasLoopStack s
  , MonadState s m
  , CfgComponent gs s
  ) => TermLab gs l -> m (EnterExitPair gs h) -> m (EnterExitPair gs i) -> m (EnterExitPair gs j) -> m (EnterExitPair gs k)
constructCfgWhileElse :: TermLab gs l
-> m (EnterExitPair gs h)
-> m (EnterExitPair gs i)
-> m (EnterExitPair gs j)
-> m (EnterExitPair gs k)
constructCfgWhileElse t :: TermLab gs l
t mExp :: m (EnterExitPair gs h)
mExp mBody :: m (EnterExitPair gs i)
mBody mElse :: m (EnterExitPair gs j)
mElse = do
  CfgNode gs
enterNode     <- TermLab gs l -> CfgNodeType -> m (CfgNode gs)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) l.
(HasCurCfg s fs, HasLabelGen s, MonadState s m) =>
TermLab fs l -> CfgNodeType -> m (CfgNode fs)
addCfgNode TermLab gs l
t CfgNodeType
EnterNode
  CfgNode gs
loopEntryNode <- TermLab gs l -> CfgNodeType -> m (CfgNode gs)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) l.
(HasCurCfg s fs, HasLabelGen s, MonadState s m) =>
TermLab fs l -> CfgNodeType -> m (CfgNode fs)
addCfgNode TermLab gs l
t CfgNodeType
LoopEntryNode
  CfgNode gs
exitNode      <- TermLab gs l -> CfgNodeType -> m (CfgNode gs)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) l.
(HasCurCfg s fs, HasLabelGen s, MonadState s m) =>
TermLab fs l -> CfgNodeType -> m (CfgNode fs)
addCfgNode TermLab gs l
t CfgNodeType
ExitNode

  EnterExitPair gs Any
exp <- m (EnterExitPair gs h)
mExp m (EnterExitPair gs h)
-> (EnterExitPair gs h -> m (EnterExitPair gs Any))
-> m (EnterExitPair gs Any)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= EnterExitPair gs h -> m (EnterExitPair gs Any)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) i j.
(HasCurCfg s fs, All HTraversable fs, All HFoldable fs,
 All HFunctor fs, MonadState s m) =>
EnterExitPair fs i -> m (EnterExitPair fs j)
collapseEnterExit
  CfgNode gs -> CfgNode gs -> m ()
forall s (m :: * -> *) (fs :: [(* -> *) -> * -> *]).
(MonadState s m, HasLoopStack s) =>
CfgNode fs -> CfgNode fs -> m ()
pushLoopNode CfgNode gs
loopEntryNode CfgNode gs
exitNode
  EnterExitPair gs i
body <- m (EnterExitPair gs i)
mBody
  m ()
forall s (m :: * -> *). (MonadState s m, HasLoopStack s) => m ()
popLoopNode

  EnterExitPair gs Any
els <- m (EnterExitPair gs j)
mElse m (EnterExitPair gs j)
-> (EnterExitPair gs j -> m (EnterExitPair gs Any))
-> m (EnterExitPair gs Any)
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= EnterExitPair gs j -> m (EnterExitPair gs Any)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) i j.
(HasCurCfg s fs, All HTraversable fs, All HFoldable fs,
 All HFunctor fs, MonadState s m) =>
EnterExitPair fs i -> m (EnterExitPair fs j)
collapseEnterExit

  EnterExitPair gs Any
end <- EnterExitPair gs Any
-> EnterExitPair gs Any -> m (EnterExitPair gs Any)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) i j k.
(HasCurCfg s fs, All HTraversable fs, All HFoldable fs,
 All HFunctor fs, MonadState s m) =>
EnterExitPair fs i -> EnterExitPair fs j -> m (EnterExitPair fs k)
combineEnterExit EnterExitPair gs Any
els (CfgNode gs -> EnterExitPair gs Any
forall (fs :: [(* -> *) -> * -> *]) l.
CfgNode fs -> EnterExitPair fs l
identEnterExit CfgNode gs
exitNode)

  (Cfg gs -> Identity (Cfg gs)) -> s -> Identity s
forall c (fs :: [(* -> *) -> * -> *]).
HasCurCfg c fs =>
Lens' c (Cfg fs)
cur_cfg ((Cfg gs -> Identity (Cfg gs)) -> s -> Identity s)
-> (Cfg gs -> Cfg gs) -> m ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= CfgNode gs -> CfgNode gs -> Cfg gs -> Cfg gs
forall (fs :: [(* -> *) -> * -> *]).
CfgNode fs -> CfgNode fs -> Cfg fs -> Cfg fs
addEdge CfgNode gs
enterNode CfgNode gs
loopEntryNode
  (Cfg gs -> Identity (Cfg gs)) -> s -> Identity s
forall c (fs :: [(* -> *) -> * -> *]).
HasCurCfg c fs =>
Lens' c (Cfg fs)
cur_cfg ((Cfg gs -> Identity (Cfg gs)) -> s -> Identity s)
-> (Cfg gs -> Cfg gs) -> m ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= CfgNode gs -> CfgNode gs -> Cfg gs -> Cfg gs
forall (fs :: [(* -> *) -> * -> *]).
CfgNode fs -> CfgNode fs -> Cfg fs -> Cfg fs
addEdge CfgNode gs
loopEntryNode (EnterExitPair gs Any -> CfgNode gs
forall (fs :: [(* -> *) -> * -> *]) l.
EnterExitPair fs l -> CfgNode fs
enter EnterExitPair gs Any
exp)
  (Cfg gs -> Identity (Cfg gs)) -> s -> Identity s
forall c (fs :: [(* -> *) -> * -> *]).
HasCurCfg c fs =>
Lens' c (Cfg fs)
cur_cfg ((Cfg gs -> Identity (Cfg gs)) -> s -> Identity s)
-> (Cfg gs -> Cfg gs) -> m ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= CfgNode gs -> CfgNode gs -> Cfg gs -> Cfg gs
forall (fs :: [(* -> *) -> * -> *]).
CfgNode fs -> CfgNode fs -> Cfg fs -> Cfg fs
addEdge (EnterExitPair gs Any -> CfgNode gs
forall (fs :: [(* -> *) -> * -> *]) l.
EnterExitPair fs l -> CfgNode fs
exit EnterExitPair gs Any
exp) (EnterExitPair gs i -> CfgNode gs
forall (fs :: [(* -> *) -> * -> *]) l.
EnterExitPair fs l -> CfgNode fs
enter EnterExitPair gs i
body)
  (Cfg gs -> Identity (Cfg gs)) -> s -> Identity s
forall c (fs :: [(* -> *) -> * -> *]).
HasCurCfg c fs =>
Lens' c (Cfg fs)
cur_cfg ((Cfg gs -> Identity (Cfg gs)) -> s -> Identity s)
-> (Cfg gs -> Cfg gs) -> m ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= CfgNode gs -> CfgNode gs -> Cfg gs -> Cfg gs
forall (fs :: [(* -> *) -> * -> *]).
CfgNode fs -> CfgNode fs -> Cfg fs -> Cfg fs
addEdge (EnterExitPair gs Any -> CfgNode gs
forall (fs :: [(* -> *) -> * -> *]) l.
EnterExitPair fs l -> CfgNode fs
exit EnterExitPair gs Any
exp) (EnterExitPair gs Any -> CfgNode gs
forall (fs :: [(* -> *) -> * -> *]) l.
EnterExitPair fs l -> CfgNode fs
enter EnterExitPair gs Any
end)
  (Cfg gs -> Identity (Cfg gs)) -> s -> Identity s
forall c (fs :: [(* -> *) -> * -> *]).
HasCurCfg c fs =>
Lens' c (Cfg fs)
cur_cfg ((Cfg gs -> Identity (Cfg gs)) -> s -> Identity s)
-> (Cfg gs -> Cfg gs) -> m ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= CfgNode gs -> CfgNode gs -> Cfg gs -> Cfg gs
forall (fs :: [(* -> *) -> * -> *]).
CfgNode fs -> CfgNode fs -> Cfg fs -> Cfg fs
addEdge (EnterExitPair gs i -> CfgNode gs
forall (fs :: [(* -> *) -> * -> *]) l.
EnterExitPair fs l -> CfgNode fs
exit EnterExitPair gs i
body) CfgNode gs
loopEntryNode

  EnterExitPair gs k -> m (EnterExitPair gs k)
forall (m :: * -> *) a. Monad m => a -> m a
return (EnterExitPair gs k -> m (EnterExitPair gs k))
-> EnterExitPair gs k -> m (EnterExitPair gs k)
forall a b. (a -> b) -> a -> b
$ CfgNode gs -> CfgNode gs -> EnterExitPair gs k
forall (fs :: [(* -> *) -> * -> *]) l.
CfgNode fs -> CfgNode fs -> EnterExitPair fs l
EnterExitPair CfgNode gs
enterNode CfgNode gs
exitNode

-- Excludes evaluating default arguments from the CFG. I don't remember why I did this.
constructCfgFunctionDef ::
  ( CfgComponent gs s
  , MonadState s m
  ) => TermLab gs l -> m (EnterExitPair gs i) -> m (EnterExitPair gs l)
constructCfgFunctionDef :: TermLab gs l -> m (EnterExitPair gs i) -> m (EnterExitPair gs l)
constructCfgFunctionDef t :: TermLab gs l
t body :: m (EnterExitPair gs i)
body = m (EnterExitPair gs i)
body m (EnterExitPair gs i)
-> m (EnterExitPair gs l) -> m (EnterExitPair gs l)
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> TermLab gs l -> m (EnterExitPair gs l)
forall s (m :: * -> *) (gs :: [(* -> *) -> * -> *]) l.
(MonadState s m, CfgComponent gs s) =>
TermLab gs l -> m (EnterExitPair gs l)
constructCfgEmpty TermLab gs l
t

-- When developing this, I ran afoul of a GHC bug that resulted in my program segfaulting (and changed when
-- I swapped the order of my instance declarations). Luckily, a "stack clean" fixed the problem

instance {-# OVERLAPPING #-} ConstructCfg MPythonSig PythonCfgState Statement where
  constructCfg :: (:&:)
  Statement
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> HState PythonCfgState (EnterExitPair MPythonSig) i
constructCfg ((:&:)
  Statement
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (Statement (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' -> (t :: AnnTerm Label MPythonSig i
t :*: While cond :: HState PythonCfgState (EnterExitPair MPythonSig) ExprL
cond body :: HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
body els :: HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
els _)) = State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ AnnTerm Label MPythonSig i
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall s (m :: * -> *) (gs :: [(* -> *) -> * -> *]) l h i j k.
(HasLoopStack s, MonadState s m, CfgComponent gs s) =>
TermLab gs l
-> m (EnterExitPair gs h)
-> m (EnterExitPair gs i)
-> m (EnterExitPair gs j)
-> m (EnterExitPair gs k)
constructCfgWhileElse AnnTerm Label MPythonSig i
t (HState PythonCfgState (EnterExitPair MPythonSig) ExprL
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) ExprL
cond) (HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
body) (HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
els)
  constructCfg ((:&:)
  Statement
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (Statement (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' -> (t :: AnnTerm Label MPythonSig i
t :*: For _ cond :: HState PythonCfgState (EnterExitPair MPythonSig) ExprL
cond body :: HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
body els :: HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
els _)) = State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ AnnTerm Label MPythonSig i
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall s (m :: * -> *) (gs :: [(* -> *) -> * -> *]) l h i j k.
(HasLoopStack s, MonadState s m, CfgComponent gs s) =>
TermLab gs l
-> m (EnterExitPair gs h)
-> m (EnterExitPair gs i)
-> m (EnterExitPair gs j)
-> m (EnterExitPair gs k)
constructCfgWhileElse AnnTerm Label MPythonSig i
t (HState PythonCfgState (EnterExitPair MPythonSig) ExprL
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) ExprL
cond) (HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
body) (HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
els)

  constructCfg ((:&:)
  Statement
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (Statement (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' -> t :: AnnTerm Label MPythonSig i
t :*: Conditional clauses :: HState
  PythonCfgState (EnterExitPair MPythonSig) [(ExprL, [StatementL])]
clauses els :: HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
els _) = State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ AnnTerm Label MPythonSig i
-> StateT
     PythonCfgState
     Identity
     [(EnterExitPair MPythonSig ExprL,
       EnterExitPair MPythonSig [StatementL])]
-> StateT
     PythonCfgState
     Identity
     (Maybe (EnterExitPair MPythonSig [StatementL]))
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall s (m :: * -> *) (gs :: [(* -> *) -> * -> *]) l i j k.
(MonadState s m, CfgComponent gs s) =>
TermLab gs l
-> m [(EnterExitPair gs i, EnterExitPair gs j)]
-> m (Maybe (EnterExitPair gs k))
-> m (EnterExitPair gs l)
constructCfgIfElseIfElse AnnTerm Label MPythonSig i
t ((EnterExitPair MPythonSig [(ExprL, [StatementL])]
 -> [(EnterExitPair MPythonSig ExprL,
      EnterExitPair MPythonSig [StatementL])])
-> StateT
     PythonCfgState
     Identity
     (EnterExitPair MPythonSig [(ExprL, [StatementL])])
-> StateT
     PythonCfgState
     Identity
     [(EnterExitPair MPythonSig ExprL,
       EnterExitPair MPythonSig [StatementL])]
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM ((EnterExitPair MPythonSig (ExprL, [StatementL])
 -> (EnterExitPair MPythonSig ExprL,
     EnterExitPair MPythonSig [StatementL]))
-> [EnterExitPair MPythonSig (ExprL, [StatementL])]
-> [(EnterExitPair MPythonSig ExprL,
     EnterExitPair MPythonSig [StatementL])]
forall a b. (a -> b) -> [a] -> [b]
map EnterExitPair MPythonSig (ExprL, [StatementL])
-> (EnterExitPair MPythonSig ExprL,
    EnterExitPair MPythonSig [StatementL])
forall (fs :: [(* -> *) -> * -> *]) a b.
(PairF :-<: fs) =>
EnterExitPair fs (a, b) -> (EnterExitPair fs a, EnterExitPair fs b)
extractEEPPair ([EnterExitPair MPythonSig (ExprL, [StatementL])]
 -> [(EnterExitPair MPythonSig ExprL,
      EnterExitPair MPythonSig [StatementL])])
-> (EnterExitPair MPythonSig [(ExprL, [StatementL])]
    -> [EnterExitPair MPythonSig (ExprL, [StatementL])])
-> EnterExitPair MPythonSig [(ExprL, [StatementL])]
-> [(EnterExitPair MPythonSig ExprL,
     EnterExitPair MPythonSig [StatementL])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EnterExitPair MPythonSig [(ExprL, [StatementL])]
-> [EnterExitPair MPythonSig (ExprL, [StatementL])]
forall (fs :: [(* -> *) -> * -> *]) l.
(ListF :-<: fs, Typeable l) =>
EnterExitPair fs [l] -> [EnterExitPair fs l]
extractEEPList) (StateT
   PythonCfgState
   Identity
   (EnterExitPair MPythonSig [(ExprL, [StatementL])])
 -> StateT
      PythonCfgState
      Identity
      [(EnterExitPair MPythonSig ExprL,
        EnterExitPair MPythonSig [StatementL])])
-> StateT
     PythonCfgState
     Identity
     (EnterExitPair MPythonSig [(ExprL, [StatementL])])
-> StateT
     PythonCfgState
     Identity
     [(EnterExitPair MPythonSig ExprL,
       EnterExitPair MPythonSig [StatementL])]
forall a b. (a -> b) -> a -> b
$ HState
  PythonCfgState (EnterExitPair MPythonSig) [(ExprL, [StatementL])]
-> StateT
     PythonCfgState
     Identity
     (EnterExitPair MPythonSig [(ExprL, [StatementL])])
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState
  PythonCfgState (EnterExitPair MPythonSig) [(ExprL, [StatementL])]
clauses) ((EnterExitPair MPythonSig [StatementL]
 -> Maybe (EnterExitPair MPythonSig [StatementL]))
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
-> StateT
     PythonCfgState
     Identity
     (Maybe (EnterExitPair MPythonSig [StatementL]))
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM EnterExitPair MPythonSig [StatementL]
-> Maybe (EnterExitPair MPythonSig [StatementL])
forall a. a -> Maybe a
Just (StateT
   PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
 -> StateT
      PythonCfgState
      Identity
      (Maybe (EnterExitPair MPythonSig [StatementL])))
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
-> StateT
     PythonCfgState
     Identity
     (Maybe (EnterExitPair MPythonSig [StatementL]))
forall a b. (a -> b) -> a -> b
$ HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
els)

  constructCfg ((:&:)
  Statement
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (Statement (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' -> (t :: AnnTerm Label MPythonSig i
t :*: Return e :: HState PythonCfgState (EnterExitPair MPythonSig) (Maybe ExprL)
e _)) = State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ AnnTerm Label MPythonSig i
-> StateT
     PythonCfgState Identity (Maybe (EnterExitPair MPythonSig ExprL))
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall s (m :: * -> *) (gs :: [(* -> *) -> * -> *]) l i.
(MonadState s m, CfgComponent gs s) =>
TermLab gs l
-> m (Maybe (EnterExitPair gs i)) -> m (EnterExitPair gs l)
constructCfgReturn AnnTerm Label MPythonSig i
t (StateT
  PythonCfgState Identity (EnterExitPair MPythonSig (Maybe ExprL))
-> StateT
     PythonCfgState Identity (Maybe (EnterExitPair MPythonSig ExprL))
forall (fs :: [(* -> *) -> * -> *]) (m :: * -> *) l.
(All (KExtractF' Maybe) fs, Monad m) =>
m (EnterExitPair fs (Maybe l)) -> m (Maybe (EnterExitPair fs l))
extractEEPMaybe (StateT
   PythonCfgState Identity (EnterExitPair MPythonSig (Maybe ExprL))
 -> StateT
      PythonCfgState Identity (Maybe (EnterExitPair MPythonSig ExprL)))
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig (Maybe ExprL))
-> StateT
     PythonCfgState Identity (Maybe (EnterExitPair MPythonSig ExprL))
forall a b. (a -> b) -> a -> b
$ HState PythonCfgState (EnterExitPair MPythonSig) (Maybe ExprL)
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig (Maybe ExprL))
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) (Maybe ExprL)
e)
  constructCfg ((:&:)
  Statement
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (Statement (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' -> (t :: AnnTerm Label MPythonSig i
t :*: Try body :: HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
body handlers :: HState PythonCfgState (EnterExitPair MPythonSig) [HandlerL]
handlers els :: HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
els finally :: HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
finally _)) = State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ do
    EnterExitPair MPythonSig [StatementL]
eepBody <- HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
body
    HState PythonCfgState (EnterExitPair MPythonSig) [HandlerL]
-> State PythonCfgState (EnterExitPair MPythonSig [HandlerL])
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) [HandlerL]
handlers
    EnterExitPair MPythonSig [StatementL]
eepElse <- HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
els
    HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
finally

    EnterExitPair MPythonSig Any
eeMain <- EnterExitPair MPythonSig [StatementL]
-> EnterExitPair MPythonSig [StatementL]
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig Any)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) i j k.
(HasCurCfg s fs, All HTraversable fs, All HFoldable fs,
 All HFunctor fs, MonadState s m) =>
EnterExitPair fs i -> EnterExitPair fs j -> m (EnterExitPair fs k)
combineEnterExit EnterExitPair MPythonSig [StatementL]
eepBody EnterExitPair MPythonSig [StatementL]
eepElse

    CfgNode MPythonSig
enterNode <- AnnTerm Label MPythonSig i
-> CfgNodeType
-> StateT PythonCfgState Identity (CfgNode MPythonSig)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) l.
(HasCurCfg s fs, HasLabelGen s, MonadState s m) =>
TermLab fs l -> CfgNodeType -> m (CfgNode fs)
addCfgNode AnnTerm Label MPythonSig i
t CfgNodeType
EnterNode
    CfgNode MPythonSig
exitNode  <- AnnTerm Label MPythonSig i
-> CfgNodeType
-> StateT PythonCfgState Identity (CfgNode MPythonSig)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) l.
(HasCurCfg s fs, HasLabelGen s, MonadState s m) =>
TermLab fs l -> CfgNodeType -> m (CfgNode fs)
addCfgNode AnnTerm Label MPythonSig i
t CfgNodeType
ExitNode

    EnterExitPair MPythonSig Any
p <- EnterExitPair MPythonSig Any
-> EnterExitPair MPythonSig Any
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig Any)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) i j k.
(HasCurCfg s fs, All HTraversable fs, All HFoldable fs,
 All HFunctor fs, MonadState s m) =>
EnterExitPair fs i -> EnterExitPair fs j -> m (EnterExitPair fs k)
combineEnterExit (CfgNode MPythonSig -> EnterExitPair MPythonSig Any
forall (fs :: [(* -> *) -> * -> *]) l.
CfgNode fs -> EnterExitPair fs l
identEnterExit CfgNode MPythonSig
enterNode) EnterExitPair MPythonSig Any
eeMain
    EnterExitPair MPythonSig Any
-> EnterExitPair MPythonSig Any
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) i j k.
(HasCurCfg s fs, All HTraversable fs, All HFoldable fs,
 All HFunctor fs, MonadState s m) =>
EnterExitPair fs i -> EnterExitPair fs j -> m (EnterExitPair fs k)
combineEnterExit EnterExitPair MPythonSig Any
p (CfgNode MPythonSig -> EnterExitPair MPythonSig Any
forall (fs :: [(* -> *) -> * -> *]) l.
CfgNode fs -> EnterExitPair fs l
identEnterExit CfgNode MPythonSig
exitNode)

  constructCfg ((:&:)
  Statement
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (Statement (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' -> (t :: AnnTerm Label MPythonSig i
t :*: Raise e :: HState PythonCfgState (EnterExitPair MPythonSig) RaiseExprL
e _)) = State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ AnnTerm Label MPythonSig i
-> StateT
     PythonCfgState
     Identity
     (Maybe (EnterExitPair MPythonSig RaiseExprL))
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall s (m :: * -> *) (gs :: [(* -> *) -> * -> *]) l i.
(MonadState s m, CfgComponent gs s) =>
TermLab gs l
-> m (Maybe (EnterExitPair gs i)) -> m (EnterExitPair gs l)
constructCfgReturn AnnTerm Label MPythonSig i
t ((EnterExitPair MPythonSig RaiseExprL
 -> Maybe (EnterExitPair MPythonSig RaiseExprL))
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig RaiseExprL)
-> StateT
     PythonCfgState
     Identity
     (Maybe (EnterExitPair MPythonSig RaiseExprL))
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM EnterExitPair MPythonSig RaiseExprL
-> Maybe (EnterExitPair MPythonSig RaiseExprL)
forall a. a -> Maybe a
Just (StateT
   PythonCfgState Identity (EnterExitPair MPythonSig RaiseExprL)
 -> StateT
      PythonCfgState
      Identity
      (Maybe (EnterExitPair MPythonSig RaiseExprL)))
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig RaiseExprL)
-> StateT
     PythonCfgState
     Identity
     (Maybe (EnterExitPair MPythonSig RaiseExprL))
forall a b. (a -> b) -> a -> b
$ HState PythonCfgState (EnterExitPair MPythonSig) RaiseExprL
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig RaiseExprL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) RaiseExprL
e)
  constructCfg ((:&:)
  Statement
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (Statement (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' -> (t :: AnnTerm Label MPythonSig i
t :*: Break _)) = State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ AnnTerm Label MPythonSig i
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall s (m :: * -> *) (gs :: [(* -> *) -> * -> *]) l i.
(HasLoopStack s, MonadState s m, CfgComponent gs s) =>
TermLab gs l -> m (EnterExitPair gs i)
constructCfgBreak AnnTerm Label MPythonSig i
t
  constructCfg ((:&:)
  Statement
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (Statement (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' -> (t :: AnnTerm Label MPythonSig i
t :*: Continue _)) = State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ AnnTerm Label MPythonSig i
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall s (m :: * -> *) (gs :: [(* -> *) -> * -> *]) l i.
(HasLoopStack s, MonadState s m, CfgComponent gs s) =>
TermLab gs l -> m (EnterExitPair gs i)
constructCfgContinue AnnTerm Label MPythonSig i
t

  constructCfg t :: (:&:)
  Statement
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
t = (:&:)
  Statement
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) s.
(f :-<: gs, HTraversable f, CfgComponent gs s, SortChecks gs) =>
PreRAlg
  (f :&: Label) (Sum gs :&: Label) (HState s (EnterExitPair gs))
constructCfgDefault (:&:)
  Statement
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
t

instance {-# OVERLAPPING #-} ConstructCfg MPythonSig PythonCfgState FunctionDef where
  constructCfg :: (:&:)
  FunctionDef
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> HState PythonCfgState (EnterExitPair MPythonSig) i
constructCfg ((:&:)
  FunctionDef
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (FunctionDef (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' -> t :: AnnTerm Label MPythonSig i
t :*: FunctionDef _ _ _ body :: HState PythonCfgState (EnterExitPair MPythonSig) FunctionBodyL
body) = State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$
    AnnTerm Label MPythonSig i
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig FunctionBodyL)
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall (gs :: [(* -> *) -> * -> *]) s (m :: * -> *) l i.
(CfgComponent gs s, MonadState s m) =>
TermLab gs l -> m (EnterExitPair gs i) -> m (EnterExitPair gs l)
constructCfgFunctionDef AnnTerm Label MPythonSig i
t (HState PythonCfgState (EnterExitPair MPythonSig) FunctionBodyL
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig FunctionBodyL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) FunctionBodyL
body)

-- | Control flow actually does flow through for classes; it's not a suspended computation.
-- This is a bit of a hack, used to prevent "del" statements in TAC from crossing a scope boundary,
-- so that "@foo(1+1) class Bar: pass" transforms to "t=1+1; @foo(t) class Bar: pass; del t" instead
-- of "t = 1+1; @foo(t) class Bar: del t; pass" . My overall conclusion is that we need a much
-- smarter architecture for building program transformations, but, in this case, we could do this
-- better by integrating the boundary condition of the CFG inserter with some name machinery

instance {-# OVERLAPPING #-} ConstructCfg MPythonSig PythonCfgState PyClass where
  constructCfg :: (:&:)
  PyClass
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> HState PythonCfgState (EnterExitPair MPythonSig) i
constructCfg ((:&:)
  PyClass
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (PyClass (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' -> t :: AnnTerm Label MPythonSig i
t :*: PyClass _ args :: HState PythonCfgState (EnterExitPair MPythonSig) [ArgumentL]
args body :: HState PythonCfgState (EnterExitPair MPythonSig) PyBlockL
body) = State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ do
    HState PythonCfgState (EnterExitPair MPythonSig) PyBlockL
-> State PythonCfgState (EnterExitPair MPythonSig PyBlockL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) PyBlockL
body
    EnterExitPair MPythonSig Any
a <- EnterExitPair MPythonSig [ArgumentL]
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig Any)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) i j.
(HasCurCfg s fs, All HTraversable fs, All HFoldable fs,
 All HFunctor fs, MonadState s m) =>
EnterExitPair fs i -> m (EnterExitPair fs j)
collapseEnterExit (EnterExitPair MPythonSig [ArgumentL]
 -> StateT PythonCfgState Identity (EnterExitPair MPythonSig Any))
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [ArgumentL])
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig Any)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< HState PythonCfgState (EnterExitPair MPythonSig) [ArgumentL]
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [ArgumentL])
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) [ArgumentL]
args
    CfgNode MPythonSig
enterNode <- AnnTerm Label MPythonSig i
-> CfgNodeType
-> StateT PythonCfgState Identity (CfgNode MPythonSig)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) l.
(HasCurCfg s fs, HasLabelGen s, MonadState s m) =>
TermLab fs l -> CfgNodeType -> m (CfgNode fs)
addCfgNode AnnTerm Label MPythonSig i
t CfgNodeType
EnterNode
    CfgNode MPythonSig
exitNode  <- AnnTerm Label MPythonSig i
-> CfgNodeType
-> StateT PythonCfgState Identity (CfgNode MPythonSig)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) l.
(HasCurCfg s fs, HasLabelGen s, MonadState s m) =>
TermLab fs l -> CfgNodeType -> m (CfgNode fs)
addCfgNode AnnTerm Label MPythonSig i
t CfgNodeType
ExitNode

    EnterExitPair MPythonSig Any
p <- EnterExitPair MPythonSig Any
-> EnterExitPair MPythonSig Any
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig Any)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) i j k.
(HasCurCfg s fs, All HTraversable fs, All HFoldable fs,
 All HFunctor fs, MonadState s m) =>
EnterExitPair fs i -> EnterExitPair fs j -> m (EnterExitPair fs k)
combineEnterExit (CfgNode MPythonSig -> EnterExitPair MPythonSig Any
forall (fs :: [(* -> *) -> * -> *]) l.
CfgNode fs -> EnterExitPair fs l
identEnterExit CfgNode MPythonSig
enterNode) EnterExitPair MPythonSig Any
a
    EnterExitPair MPythonSig Any
-> EnterExitPair MPythonSig Any
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) i j k.
(HasCurCfg s fs, All HTraversable fs, All HFoldable fs,
 All HFunctor fs, MonadState s m) =>
EnterExitPair fs i -> EnterExitPair fs j -> m (EnterExitPair fs k)
combineEnterExit EnterExitPair MPythonSig Any
p (CfgNode MPythonSig -> EnterExitPair MPythonSig Any
forall (fs :: [(* -> *) -> * -> *]) l.
CfgNode fs -> EnterExitPair fs l
identEnterExit CfgNode MPythonSig
exitNode)

instance {-# OVERLAPPING #-} ConstructCfg MPythonSig PythonCfgState PyWith where
  constructCfg :: (:&:)
  PyWith
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> HState PythonCfgState (EnterExitPair MPythonSig) i
constructCfg ((:&:)
  PyWith
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (PyWith (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' -> t :: AnnTerm Label MPythonSig i
t :*: PyWith hBinders :: HState PythonCfgState (EnterExitPair MPythonSig) [PyWithBinderL]
hBinders hBody :: HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
hBody) = State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ do
    CfgNode MPythonSig
enterNode <- AnnTerm Label MPythonSig i
-> CfgNodeType
-> StateT PythonCfgState Identity (CfgNode MPythonSig)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) l.
(HasCurCfg s fs, HasLabelGen s, MonadState s m) =>
TermLab fs l -> CfgNodeType -> m (CfgNode fs)
addCfgNode AnnTerm Label MPythonSig i
t CfgNodeType
EnterNode

    [EnterExitPair MPythonSig PyWithBinderL]
binders <- EnterExitPair MPythonSig [PyWithBinderL]
-> [EnterExitPair MPythonSig PyWithBinderL]
forall (fs :: [(* -> *) -> * -> *]) l.
(ListF :-<: fs, Typeable l) =>
EnterExitPair fs [l] -> [EnterExitPair fs l]
extractEEPList (EnterExitPair MPythonSig [PyWithBinderL]
 -> [EnterExitPair MPythonSig PyWithBinderL])
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [PyWithBinderL])
-> StateT
     PythonCfgState Identity [EnterExitPair MPythonSig PyWithBinderL]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> HState PythonCfgState (EnterExitPair MPythonSig) [PyWithBinderL]
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [PyWithBinderL])
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) [PyWithBinderL]
hBinders
    [CfgNode MPythonSig]
midNodes <- [Int]
-> (Int -> StateT PythonCfgState Identity (CfgNode MPythonSig))
-> StateT PythonCfgState Identity [CfgNode MPythonSig]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
t a -> (a -> f b) -> f (t b)
for [0..([EnterExitPair MPythonSig PyWithBinderL] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [EnterExitPair MPythonSig PyWithBinderL]
binders Int -> Int -> Int
forall a. Num a => a -> a -> a
- 1)] ((Int -> StateT PythonCfgState Identity (CfgNode MPythonSig))
 -> StateT PythonCfgState Identity [CfgNode MPythonSig])
-> (Int -> StateT PythonCfgState Identity (CfgNode MPythonSig))
-> StateT PythonCfgState Identity [CfgNode MPythonSig]
forall a b. (a -> b) -> a -> b
$ \i :: Int
i ->
                          AnnTerm Label MPythonSig i
-> CfgNodeType
-> StateT PythonCfgState Identity (CfgNode MPythonSig)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) l.
(HasCurCfg s fs, HasLabelGen s, MonadState s m) =>
TermLab fs l -> CfgNodeType -> m (CfgNode fs)
addCfgNode AnnTerm Label MPythonSig i
t (NodeEvaluationPoint -> CfgNodeType
evalPointToNodeType (Int -> NodeEvaluationPoint
BeforeIntermediateEvalPoint Int
i))

    CfgNode MPythonSig
exitNode <- AnnTerm Label MPythonSig i
-> CfgNodeType
-> StateT PythonCfgState Identity (CfgNode MPythonSig)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) l.
(HasCurCfg s fs, HasLabelGen s, MonadState s m) =>
TermLab fs l -> CfgNodeType -> m (CfgNode fs)
addCfgNode AnnTerm Label MPythonSig i
t CfgNodeType
ExitNode

    EnterExitPair MPythonSig Any
body <- EnterExitPair MPythonSig [StatementL]
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig Any)
forall s (fs :: [(* -> *) -> * -> *]) (m :: * -> *) i j.
(HasCurCfg s fs, All HTraversable fs, All HFoldable fs,
 All HFunctor fs, MonadState s m) =>
EnterExitPair fs i -> m (EnterExitPair fs j)
collapseEnterExit (EnterExitPair MPythonSig [StatementL]
 -> StateT PythonCfgState Identity (EnterExitPair MPythonSig Any))
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig Any)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig [StatementL])
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) [StatementL]
hBody

    (Cfg MPythonSig -> Identity (Cfg MPythonSig))
-> PythonCfgState -> Identity PythonCfgState
forall c (fs :: [(* -> *) -> * -> *]).
HasCurCfg c fs =>
Lens' c (Cfg fs)
cur_cfg ((Cfg MPythonSig -> Identity (Cfg MPythonSig))
 -> PythonCfgState -> Identity PythonCfgState)
-> (Cfg MPythonSig -> Cfg MPythonSig)
-> StateT PythonCfgState Identity ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= CfgNode MPythonSig
-> CfgNode MPythonSig -> Cfg MPythonSig -> Cfg MPythonSig
forall (fs :: [(* -> *) -> * -> *]).
CfgNode fs -> CfgNode fs -> Cfg fs -> Cfg fs
addEdge CfgNode MPythonSig
enterNode ([CfgNode MPythonSig] -> CfgNode MPythonSig
forall a. [a] -> a
head [CfgNode MPythonSig]
midNodes)
    (Cfg MPythonSig -> Identity (Cfg MPythonSig))
-> PythonCfgState -> Identity PythonCfgState
forall c (fs :: [(* -> *) -> * -> *]).
HasCurCfg c fs =>
Lens' c (Cfg fs)
cur_cfg ((Cfg MPythonSig -> Identity (Cfg MPythonSig))
 -> PythonCfgState -> Identity PythonCfgState)
-> (Cfg MPythonSig -> Cfg MPythonSig)
-> StateT PythonCfgState Identity ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= CfgNode MPythonSig
-> CfgNode MPythonSig -> Cfg MPythonSig -> Cfg MPythonSig
forall (fs :: [(* -> *) -> * -> *]).
CfgNode fs -> CfgNode fs -> Cfg fs -> Cfg fs
addEdge (EnterExitPair MPythonSig PyWithBinderL -> CfgNode MPythonSig
forall (fs :: [(* -> *) -> * -> *]) l.
EnterExitPair fs l -> CfgNode fs
exit ([EnterExitPair MPythonSig PyWithBinderL]
-> EnterExitPair MPythonSig PyWithBinderL
forall a. [a] -> a
last [EnterExitPair MPythonSig PyWithBinderL]
binders)) (EnterExitPair MPythonSig Any -> CfgNode MPythonSig
forall (fs :: [(* -> *) -> * -> *]) l.
EnterExitPair fs l -> CfgNode fs
enter EnterExitPair MPythonSig Any
body)
    (Cfg MPythonSig -> Identity (Cfg MPythonSig))
-> PythonCfgState -> Identity PythonCfgState
forall c (fs :: [(* -> *) -> * -> *]).
HasCurCfg c fs =>
Lens' c (Cfg fs)
cur_cfg ((Cfg MPythonSig -> Identity (Cfg MPythonSig))
 -> PythonCfgState -> Identity PythonCfgState)
-> (Cfg MPythonSig -> Cfg MPythonSig)
-> StateT PythonCfgState Identity ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= CfgNode MPythonSig
-> CfgNode MPythonSig -> Cfg MPythonSig -> Cfg MPythonSig
forall (fs :: [(* -> *) -> * -> *]).
CfgNode fs -> CfgNode fs -> Cfg fs -> Cfg fs
addEdge (EnterExitPair MPythonSig Any -> CfgNode MPythonSig
forall (fs :: [(* -> *) -> * -> *]) l.
EnterExitPair fs l -> CfgNode fs
exit EnterExitPair MPythonSig Any
body) CfgNode MPythonSig
exitNode

    [(CfgNode MPythonSig, EnterExitPair MPythonSig PyWithBinderL)]
-> ((CfgNode MPythonSig, EnterExitPair MPythonSig PyWithBinderL)
    -> StateT PythonCfgState Identity ())
-> StateT PythonCfgState Identity [()]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
t a -> (a -> f b) -> f (t b)
for ([CfgNode MPythonSig]
-> [EnterExitPair MPythonSig PyWithBinderL]
-> [(CfgNode MPythonSig, EnterExitPair MPythonSig PyWithBinderL)]
forall a b. [a] -> [b] -> [(a, b)]
zip [CfgNode MPythonSig]
midNodes [EnterExitPair MPythonSig PyWithBinderL]
binders) (((CfgNode MPythonSig, EnterExitPair MPythonSig PyWithBinderL)
  -> StateT PythonCfgState Identity ())
 -> StateT PythonCfgState Identity [()])
-> ((CfgNode MPythonSig, EnterExitPair MPythonSig PyWithBinderL)
    -> StateT PythonCfgState Identity ())
-> StateT PythonCfgState Identity [()]
forall a b. (a -> b) -> a -> b
$ \(n :: CfgNode MPythonSig
n, b :: EnterExitPair MPythonSig PyWithBinderL
b) -> (Cfg MPythonSig -> Identity (Cfg MPythonSig))
-> PythonCfgState -> Identity PythonCfgState
forall c (fs :: [(* -> *) -> * -> *]).
HasCurCfg c fs =>
Lens' c (Cfg fs)
cur_cfg ((Cfg MPythonSig -> Identity (Cfg MPythonSig))
 -> PythonCfgState -> Identity PythonCfgState)
-> (Cfg MPythonSig -> Cfg MPythonSig)
-> StateT PythonCfgState Identity ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= CfgNode MPythonSig
-> CfgNode MPythonSig -> Cfg MPythonSig -> Cfg MPythonSig
forall (fs :: [(* -> *) -> * -> *]).
CfgNode fs -> CfgNode fs -> Cfg fs -> Cfg fs
addEdge CfgNode MPythonSig
n (EnterExitPair MPythonSig PyWithBinderL -> CfgNode MPythonSig
forall (fs :: [(* -> *) -> * -> *]) l.
EnterExitPair fs l -> CfgNode fs
enter EnterExitPair MPythonSig PyWithBinderL
b)
    [(EnterExitPair MPythonSig PyWithBinderL, CfgNode MPythonSig)]
-> ((EnterExitPair MPythonSig PyWithBinderL, CfgNode MPythonSig)
    -> StateT PythonCfgState Identity ())
-> StateT PythonCfgState Identity [()]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
t a -> (a -> f b) -> f (t b)
for ([EnterExitPair MPythonSig PyWithBinderL]
-> [CfgNode MPythonSig]
-> [(EnterExitPair MPythonSig PyWithBinderL, CfgNode MPythonSig)]
forall a b. [a] -> [b] -> [(a, b)]
zip [EnterExitPair MPythonSig PyWithBinderL]
binders ([CfgNode MPythonSig] -> [CfgNode MPythonSig]
forall a. [a] -> [a]
tail [CfgNode MPythonSig]
midNodes)) (((EnterExitPair MPythonSig PyWithBinderL, CfgNode MPythonSig)
  -> StateT PythonCfgState Identity ())
 -> StateT PythonCfgState Identity [()])
-> ((EnterExitPair MPythonSig PyWithBinderL, CfgNode MPythonSig)
    -> StateT PythonCfgState Identity ())
-> StateT PythonCfgState Identity [()]
forall a b. (a -> b) -> a -> b
$ \(b :: EnterExitPair MPythonSig PyWithBinderL
b, n :: CfgNode MPythonSig
n) -> (Cfg MPythonSig -> Identity (Cfg MPythonSig))
-> PythonCfgState -> Identity PythonCfgState
forall c (fs :: [(* -> *) -> * -> *]).
HasCurCfg c fs =>
Lens' c (Cfg fs)
cur_cfg ((Cfg MPythonSig -> Identity (Cfg MPythonSig))
 -> PythonCfgState -> Identity PythonCfgState)
-> (Cfg MPythonSig -> Cfg MPythonSig)
-> StateT PythonCfgState Identity ()
forall s (m :: * -> *) a b.
MonadState s m =>
ASetter s s a b -> (a -> b) -> m ()
%= CfgNode MPythonSig
-> CfgNode MPythonSig -> Cfg MPythonSig -> Cfg MPythonSig
forall (fs :: [(* -> *) -> * -> *]).
CfgNode fs -> CfgNode fs -> Cfg fs -> Cfg fs
addEdge (EnterExitPair MPythonSig PyWithBinderL -> CfgNode MPythonSig
forall (fs :: [(* -> *) -> * -> *]) l.
EnterExitPair fs l -> CfgNode fs
exit EnterExitPair MPythonSig PyWithBinderL
b) CfgNode MPythonSig
n

    EnterExitPair MPythonSig i
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall (m :: * -> *) a. Monad m => a -> m a
return (EnterExitPair MPythonSig i
 -> State PythonCfgState (EnterExitPair MPythonSig i))
-> EnterExitPair MPythonSig i
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall a b. (a -> b) -> a -> b
$ CfgNode MPythonSig
-> CfgNode MPythonSig -> EnterExitPair MPythonSig i
forall (fs :: [(* -> *) -> * -> *]) l.
CfgNode fs -> CfgNode fs -> EnterExitPair fs l
EnterExitPair CfgNode MPythonSig
enterNode CfgNode MPythonSig
exitNode

instance {-# OVERLAPPING #-} ConstructCfg MPythonSig PythonCfgState Expr where
  constructCfg :: (:&:)
  Expr
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> HState PythonCfgState (EnterExitPair MPythonSig) i
constructCfg t' :: (:&:)
  Expr
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
t'@((:&:)
  Expr
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> Expr
     (HFix (Sum MPythonSig :&: Label)
      :*: HState PythonCfgState (EnterExitPair MPythonSig))
     i
forall (s :: (* -> *) -> * -> *) (s' :: (* -> *) -> * -> *)
       (a :: * -> *).
RemA s s' =>
s a :-> s' a
remA -> (BinaryOp (op :: HFix (Sum MPythonSig :&: Label) OpL
op :*: _) _ _ _)) = do
    let (t :: AnnTerm Label MPythonSig i
t :*: (BinaryOp _ el er _)) = (:&:)
  Expr
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (Expr (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' (:&:)
  Expr
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
t'
    case HFix (Sum MPythonSig :&: Label) OpL -> Op MPythonTerm OpL
extractOp HFix (Sum MPythonSig :&: Label) OpL
op of
      And {} -> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ AnnTerm Label MPythonSig i
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall s (m :: * -> *) (fs :: [(* -> *) -> * -> *]) l ls rs es.
(MonadState s m, CfgComponent fs s) =>
TermLab fs l
-> m (EnterExitPair fs ls)
-> m (EnterExitPair fs rs)
-> m (EnterExitPair fs es)
constructCfgShortCircuitingBinOp AnnTerm Label MPythonSig i
t (HState PythonCfgState (EnterExitPair MPythonSig) ExprL
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) ExprL
el) (HState PythonCfgState (EnterExitPair MPythonSig) ExprL
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) ExprL
er)
      Or {}  -> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ AnnTerm Label MPythonSig i
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall s (m :: * -> *) (fs :: [(* -> *) -> * -> *]) l ls rs es.
(MonadState s m, CfgComponent fs s) =>
TermLab fs l
-> m (EnterExitPair fs ls)
-> m (EnterExitPair fs rs)
-> m (EnterExitPair fs es)
constructCfgShortCircuitingBinOp AnnTerm Label MPythonSig i
t (HState PythonCfgState (EnterExitPair MPythonSig) ExprL
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) ExprL
el) (HState PythonCfgState (EnterExitPair MPythonSig) ExprL
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) ExprL
er)
      _   -> (:&:)
  Expr
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) s.
(f :-<: gs, HTraversable f, CfgComponent gs s, SortChecks gs) =>
PreRAlg
  (f :&: Label) (Sum gs :&: Label) (HState s (EnterExitPair gs))
constructCfgDefault (:&:)
  Expr
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
t'

    where extractOp :: MPythonTermLab OpL -> Op MPythonTerm OpL
          extractOp :: HFix (Sum MPythonSig :&: Label) OpL -> Op MPythonTerm OpL
extractOp (HFix (Sum MPythonSig :&: Label) OpL
-> Cxt NoHole (Sum MPythonSig) (K ()) OpL
forall (g :: (* -> *) -> * -> *) (f :: (* -> *) -> * -> *).
(RemA g f, HFunctor g) =>
CxtFun g f
stripA -> Cxt NoHole (Sum MPythonSig) (K ()) OpL
-> Maybe (Op MPythonTerm OpL)
forall (g :: (* -> *) -> * -> *) (f :: (* -> *) -> * -> *) h
       (a :: * -> *).
(g :<: f) =>
NatM Maybe (Cxt h f a) (g (Cxt h f a))
project -> Just bp :: Op MPythonTerm OpL
bp) = Op MPythonTerm OpL
bp

  constructCfg ((:&:)
  Expr
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (Expr (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' -> (t :: AnnTerm Label MPythonSig i
t :*: (Lambda _ e :: HState PythonCfgState (EnterExitPair MPythonSig) ExprL
e _))) = State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ do
    AnnTerm Label MPythonSig i
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall (gs :: [(* -> *) -> * -> *]) s (m :: * -> *) l i.
(CfgComponent gs s, MonadState s m) =>
TermLab gs l -> m (EnterExitPair gs i) -> m (EnterExitPair gs l)
constructCfgFunctionDef AnnTerm Label MPythonSig i
t (HState PythonCfgState (EnterExitPair MPythonSig) ExprL
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) ExprL
e)

  constructCfg t :: (:&:)
  Expr
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
t = (:&:)
  Expr
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) s.
(f :-<: gs, HTraversable f, CfgComponent gs s, SortChecks gs) =>
PreRAlg
  (f :&: Label) (Sum gs :&: Label) (HState s (EnterExitPair gs))
constructCfgDefault (:&:)
  Expr
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
t

instance {-# OVERLAPPING #-} ConstructCfg MPythonSig PythonCfgState PyCondExpr where
  constructCfg :: (:&:)
  PyCondExpr
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> HState PythonCfgState (EnterExitPair MPythonSig) i
constructCfg ((:&:)
  PyCondExpr
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (PyCondExpr (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' -> (t :: AnnTerm Label MPythonSig i
t :*: (PyCondExpr test :: HState PythonCfgState (EnterExitPair MPythonSig) ExprL
test succ :: HState PythonCfgState (EnterExitPair MPythonSig) ExprL
succ fail :: HState PythonCfgState (EnterExitPair MPythonSig) ExprL
fail))) = StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ do
    AnnTerm Label MPythonSig i
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
forall s (m :: * -> *) (fs :: [(* -> *) -> * -> *]) l ls rs es.
(MonadState s m, CfgComponent fs s) =>
TermLab fs l
-> m (EnterExitPair fs ls)
-> m (EnterExitPair fs rs)
-> m (EnterExitPair fs es)
-> m (EnterExitPair fs es)
constructCfgCondOp AnnTerm Label MPythonSig i
t (HState PythonCfgState (EnterExitPair MPythonSig) ExprL
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) ExprL
test) (HState PythonCfgState (EnterExitPair MPythonSig) ExprL
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) ExprL
succ) (HState PythonCfgState (EnterExitPair MPythonSig) ExprL
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) ExprL
fail)

instance {-# OVERLAPPING #-} ConstructCfg MPythonSig PythonCfgState PyComprehension where
  constructCfg :: (:&:)
  PyComprehension
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> HState PythonCfgState (EnterExitPair MPythonSig) i
constructCfg ((:&:)
  PyComprehension
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (PyComprehension
        (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' -> (t :: AnnTerm Label MPythonSig i
t :*: (PyComprehensionFor _ _ e :: HState PythonCfgState (EnterExitPair MPythonSig) ExprL
e body :: HState PythonCfgState (EnterExitPair MPythonSig) PyComprehensionL
body))) = State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ do
    AnnTerm Label MPythonSig i
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig PyComprehensionL)
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall s (m :: * -> *) (gs :: [(* -> *) -> * -> *]) l i j k.
(HasLoopStack s, MonadState s m, CfgComponent gs s) =>
TermLab gs l
-> m (EnterExitPair gs i)
-> m (EnterExitPair gs j)
-> m (EnterExitPair gs k)
constructCfgWhile AnnTerm Label MPythonSig i
t (HState PythonCfgState (EnterExitPair MPythonSig) ExprL
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) ExprL
e) (HState PythonCfgState (EnterExitPair MPythonSig) PyComprehensionL
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig PyComprehensionL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) PyComprehensionL
body)
  constructCfg ((:&:)
  PyComprehension
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> (:*:)
     (HFix (Sum MPythonSig :&: Label))
     (PyComprehension
        (HState PythonCfgState (EnterExitPair MPythonSig)))
     i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) a
       (t :: * -> *).
(HFunctor f, f :-<: gs) =>
(:&:) f a (AnnTerm a gs :*: t) :-> (AnnTerm a gs :*: f t)
collapseFProd' -> (t :: AnnTerm Label MPythonSig i
t :*: (PyComprehensionIf cond :: HState PythonCfgState (EnterExitPair MPythonSig) ExprL
cond body :: HState PythonCfgState (EnterExitPair MPythonSig) PyComprehensionL
body))) = State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall s (f :: * -> *) l. State s (f l) -> HState s f l
HState (State PythonCfgState (EnterExitPair MPythonSig i)
 -> HState PythonCfgState (EnterExitPair MPythonSig) i)
-> State PythonCfgState (EnterExitPair MPythonSig i)
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall a b. (a -> b) -> a -> b
$ do
     AnnTerm Label MPythonSig i
-> StateT
     PythonCfgState
     Identity
     [(EnterExitPair MPythonSig ExprL,
       EnterExitPair MPythonSig PyComprehensionL)]
-> StateT
     PythonCfgState Identity (Maybe (EnterExitPair MPythonSig Any))
-> State PythonCfgState (EnterExitPair MPythonSig i)
forall s (m :: * -> *) (gs :: [(* -> *) -> * -> *]) l i j k.
(MonadState s m, CfgComponent gs s) =>
TermLab gs l
-> m [(EnterExitPair gs i, EnterExitPair gs j)]
-> m (Maybe (EnterExitPair gs k))
-> m (EnterExitPair gs l)
constructCfgIfElseIfElse AnnTerm Label MPythonSig i
t (((EnterExitPair MPythonSig ExprL,
  EnterExitPair MPythonSig PyComprehensionL)
 -> [(EnterExitPair MPythonSig ExprL,
      EnterExitPair MPythonSig PyComprehensionL)])
-> StateT
     PythonCfgState
     Identity
     (EnterExitPair MPythonSig ExprL,
      EnterExitPair MPythonSig PyComprehensionL)
-> StateT
     PythonCfgState
     Identity
     [(EnterExitPair MPythonSig ExprL,
       EnterExitPair MPythonSig PyComprehensionL)]
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM (EnterExitPair MPythonSig ExprL,
 EnterExitPair MPythonSig PyComprehensionL)
-> [(EnterExitPair MPythonSig ExprL,
     EnterExitPair MPythonSig PyComprehensionL)]
forall a. a -> [a]
singleton (StateT
   PythonCfgState
   Identity
   (EnterExitPair MPythonSig ExprL,
    EnterExitPair MPythonSig PyComprehensionL)
 -> StateT
      PythonCfgState
      Identity
      [(EnterExitPair MPythonSig ExprL,
        EnterExitPair MPythonSig PyComprehensionL)])
-> StateT
     PythonCfgState
     Identity
     (EnterExitPair MPythonSig ExprL,
      EnterExitPair MPythonSig PyComprehensionL)
-> StateT
     PythonCfgState
     Identity
     [(EnterExitPair MPythonSig ExprL,
       EnterExitPair MPythonSig PyComprehensionL)]
forall a b. (a -> b) -> a -> b
$ (EnterExitPair MPythonSig ExprL
 -> EnterExitPair MPythonSig PyComprehensionL
 -> (EnterExitPair MPythonSig ExprL,
     EnterExitPair MPythonSig PyComprehensionL))
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig PyComprehensionL)
-> StateT
     PythonCfgState
     Identity
     (EnterExitPair MPythonSig ExprL,
      EnterExitPair MPythonSig PyComprehensionL)
forall (m :: * -> *) a1 a2 r.
Monad m =>
(a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 (,) (HState PythonCfgState (EnterExitPair MPythonSig) ExprL
-> StateT PythonCfgState Identity (EnterExitPair MPythonSig ExprL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) ExprL
cond) (HState PythonCfgState (EnterExitPair MPythonSig) PyComprehensionL
-> StateT
     PythonCfgState Identity (EnterExitPair MPythonSig PyComprehensionL)
forall s (f :: * -> *) l. HState s f l -> State s (f l)
unHState HState PythonCfgState (EnterExitPair MPythonSig) PyComprehensionL
body)) (Maybe (EnterExitPair MPythonSig Any)
-> StateT
     PythonCfgState Identity (Maybe (EnterExitPair MPythonSig Any))
forall (m :: * -> *) a. Monad m => a -> m a
return Maybe (EnterExitPair MPythonSig Any)
forall a. Maybe a
Nothing)
  constructCfg t :: (:&:)
  PyComprehension
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
t = (:&:)
  PyComprehension
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
-> HState PythonCfgState (EnterExitPair MPythonSig) i
forall (f :: (* -> *) -> * -> *) (gs :: [(* -> *) -> * -> *]) s.
(f :-<: gs, HTraversable f, CfgComponent gs s, SortChecks gs) =>
PreRAlg
  (f :&: Label) (Sum gs :&: Label) (HState s (EnterExitPair gs))
constructCfgDefault (:&:)
  PyComprehension
  Label
  (HFix (Sum MPythonSig :&: Label)
   :*: HState PythonCfgState (EnterExitPair MPythonSig))
  i
t

instance CfgInitState MPythonSig where
  cfgInitState :: Proxy MPythonSig -> CfgState MPythonSig
cfgInitState _ = Cfg MPythonSig
-> LabelGen -> LoopStack -> LabelMap -> PythonCfgState
PythonCfgState Cfg MPythonSig
forall (fs :: [(* -> *) -> * -> *]). Cfg fs
emptyCfg (() -> LabelGen
unsafeMkCSLabelGen ()) LoopStack
emptyLoopStack LabelMap
emptyLabelMap
#endif