module Language.Drasil.Code.Expr.Extract (
eDep, eDep',
eNamesRI, eNamesRI'
) where
import Language.Drasil (RealInterval(..), UID)
import Language.Drasil.Code.Expr (CodeExpr(..))
import Data.List (nub)
eNames :: CodeExpr -> [UID]
eNames :: CodeExpr -> [UID]
eNames (AssocA _ l :: [CodeExpr]
l) = (CodeExpr -> [UID]) -> [CodeExpr] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap CodeExpr -> [UID]
eNames [CodeExpr]
l
eNames (AssocB _ l :: [CodeExpr]
l) = (CodeExpr -> [UID]) -> [CodeExpr] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap CodeExpr -> [UID]
eNames [CodeExpr]
l
eNames (C c :: UID
c) = [UID
c]
eNames Lit{} = []
eNames (FCall f :: UID
f x :: [CodeExpr]
x ns :: [(UID, CodeExpr)]
ns) = UID
f UID -> [UID] -> [UID]
forall a. a -> [a] -> [a]
: (CodeExpr -> [UID]) -> [CodeExpr] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap CodeExpr -> [UID]
eNames [CodeExpr]
x [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ ((UID, CodeExpr) -> UID) -> [(UID, CodeExpr)] -> [UID]
forall a b. (a -> b) -> [a] -> [b]
map (UID, CodeExpr) -> UID
forall a b. (a, b) -> a
fst [(UID, CodeExpr)]
ns [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++
((UID, CodeExpr) -> [UID]) -> [(UID, CodeExpr)] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (CodeExpr -> [UID]
eNames (CodeExpr -> [UID])
-> ((UID, CodeExpr) -> CodeExpr) -> (UID, CodeExpr) -> [UID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UID, CodeExpr) -> CodeExpr
forall a b. (a, b) -> b
snd) [(UID, CodeExpr)]
ns
eNames (New c :: UID
c x :: [CodeExpr]
x ns :: [(UID, CodeExpr)]
ns) = UID
c UID -> [UID] -> [UID]
forall a. a -> [a] -> [a]
: (CodeExpr -> [UID]) -> [CodeExpr] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap CodeExpr -> [UID]
eNames [CodeExpr]
x [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ ((UID, CodeExpr) -> UID) -> [(UID, CodeExpr)] -> [UID]
forall a b. (a -> b) -> [a] -> [b]
map (UID, CodeExpr) -> UID
forall a b. (a, b) -> a
fst [(UID, CodeExpr)]
ns [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++
((UID, CodeExpr) -> [UID]) -> [(UID, CodeExpr)] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (CodeExpr -> [UID]
eNames (CodeExpr -> [UID])
-> ((UID, CodeExpr) -> CodeExpr) -> (UID, CodeExpr) -> [UID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UID, CodeExpr) -> CodeExpr
forall a b. (a, b) -> b
snd) [(UID, CodeExpr)]
ns
eNames (Message a :: UID
a m :: UID
m x :: [CodeExpr]
x ns :: [(UID, CodeExpr)]
ns) = UID
a UID -> [UID] -> [UID]
forall a. a -> [a] -> [a]
: UID
m UID -> [UID] -> [UID]
forall a. a -> [a] -> [a]
: (CodeExpr -> [UID]) -> [CodeExpr] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap CodeExpr -> [UID]
eNames [CodeExpr]
x [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ ((UID, CodeExpr) -> UID) -> [(UID, CodeExpr)] -> [UID]
forall a b. (a -> b) -> [a] -> [b]
map (UID, CodeExpr) -> UID
forall a b. (a, b) -> a
fst [(UID, CodeExpr)]
ns [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++
((UID, CodeExpr) -> [UID]) -> [(UID, CodeExpr)] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (CodeExpr -> [UID]
eNames (CodeExpr -> [UID])
-> ((UID, CodeExpr) -> CodeExpr) -> (UID, CodeExpr) -> [UID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UID, CodeExpr) -> CodeExpr
forall a b. (a, b) -> b
snd) [(UID, CodeExpr)]
ns
eNames (Field o :: UID
o f :: UID
f) = [UID
o, UID
f]
eNames (Case _ ls :: [(CodeExpr, CodeExpr)]
ls) = ((CodeExpr, CodeExpr) -> [UID]) -> [(CodeExpr, CodeExpr)] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (CodeExpr -> [UID]
eNames (CodeExpr -> [UID])
-> ((CodeExpr, CodeExpr) -> CodeExpr)
-> (CodeExpr, CodeExpr)
-> [UID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CodeExpr, CodeExpr) -> CodeExpr
forall a b. (a, b) -> a
fst) [(CodeExpr, CodeExpr)]
ls [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ ((CodeExpr, CodeExpr) -> [UID]) -> [(CodeExpr, CodeExpr)] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (CodeExpr -> [UID]
eNames (CodeExpr -> [UID])
-> ((CodeExpr, CodeExpr) -> CodeExpr)
-> (CodeExpr, CodeExpr)
-> [UID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CodeExpr, CodeExpr) -> CodeExpr
forall a b. (a, b) -> b
snd) [(CodeExpr, CodeExpr)]
ls
eNames (UnaryOp _ u :: CodeExpr
u) = CodeExpr -> [UID]
eNames CodeExpr
u
eNames (UnaryOpB _ u :: CodeExpr
u) = CodeExpr -> [UID]
eNames CodeExpr
u
eNames (UnaryOpVV _ u :: CodeExpr
u) = CodeExpr -> [UID]
eNames CodeExpr
u
eNames (UnaryOpVN _ u :: CodeExpr
u) = CodeExpr -> [UID]
eNames CodeExpr
u
eNames (ArithBinaryOp _ a :: CodeExpr
a b :: CodeExpr
b) = CodeExpr -> [UID]
eNames CodeExpr
a [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames CodeExpr
b
eNames (BoolBinaryOp _ a :: CodeExpr
a b :: CodeExpr
b) = CodeExpr -> [UID]
eNames CodeExpr
a [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames CodeExpr
b
eNames (EqBinaryOp _ a :: CodeExpr
a b :: CodeExpr
b) = CodeExpr -> [UID]
eNames CodeExpr
a [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames CodeExpr
b
eNames (LABinaryOp _ a :: CodeExpr
a b :: CodeExpr
b) = CodeExpr -> [UID]
eNames CodeExpr
a [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames CodeExpr
b
eNames (OrdBinaryOp _ a :: CodeExpr
a b :: CodeExpr
b) = CodeExpr -> [UID]
eNames CodeExpr
a [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames CodeExpr
b
eNames (VVVBinaryOp _ a :: CodeExpr
a b :: CodeExpr
b) = CodeExpr -> [UID]
eNames CodeExpr
a [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames CodeExpr
b
eNames (VVNBinaryOp _ a :: CodeExpr
a b :: CodeExpr
b) = CodeExpr -> [UID]
eNames CodeExpr
a [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames CodeExpr
b
eNames (Operator _ _ e :: CodeExpr
e) = CodeExpr -> [UID]
eNames CodeExpr
e
eNames (Matrix a :: [[CodeExpr]]
a) = ([CodeExpr] -> [UID]) -> [[CodeExpr]] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ((CodeExpr -> [UID]) -> [CodeExpr] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap CodeExpr -> [UID]
eNames) [[CodeExpr]]
a
eNames (RealI c :: UID
c b :: RealInterval CodeExpr CodeExpr
b) = UID
c UID -> [UID] -> [UID]
forall a. a -> [a] -> [a]
: RealInterval CodeExpr CodeExpr -> [UID]
eNamesRI RealInterval CodeExpr CodeExpr
b
eNamesRI :: RealInterval CodeExpr CodeExpr -> [UID]
eNamesRI :: RealInterval CodeExpr CodeExpr -> [UID]
eNamesRI (Bounded (_, il :: CodeExpr
il) (_, iu :: CodeExpr
iu)) = CodeExpr -> [UID]
eNames CodeExpr
il [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames CodeExpr
iu
eNamesRI (UpTo (_, iu :: CodeExpr
iu)) = CodeExpr -> [UID]
eNames CodeExpr
iu
eNamesRI (UpFrom (_, il :: CodeExpr
il)) = CodeExpr -> [UID]
eNames CodeExpr
il
eNames' :: CodeExpr -> [UID]
eNames' :: CodeExpr -> [UID]
eNames' (AssocA _ l :: [CodeExpr]
l) = (CodeExpr -> [UID]) -> [CodeExpr] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap CodeExpr -> [UID]
eNames' [CodeExpr]
l
eNames' (AssocB _ l :: [CodeExpr]
l) = (CodeExpr -> [UID]) -> [CodeExpr] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap CodeExpr -> [UID]
eNames' [CodeExpr]
l
eNames' (C c :: UID
c) = [UID
c]
eNames' Lit{} = []
eNames' (FCall _ x :: [CodeExpr]
x ns :: [(UID, CodeExpr)]
ns) = (CodeExpr -> [UID]) -> [CodeExpr] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap CodeExpr -> [UID]
eNames' [CodeExpr]
x [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ ((UID, CodeExpr) -> UID) -> [(UID, CodeExpr)] -> [UID]
forall a b. (a -> b) -> [a] -> [b]
map (UID, CodeExpr) -> UID
forall a b. (a, b) -> a
fst [(UID, CodeExpr)]
ns [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++
((UID, CodeExpr) -> [UID]) -> [(UID, CodeExpr)] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (CodeExpr -> [UID]
eNames (CodeExpr -> [UID])
-> ((UID, CodeExpr) -> CodeExpr) -> (UID, CodeExpr) -> [UID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(UID, CodeExpr) -> CodeExpr
forall a b. (a, b) -> b
snd) [(UID, CodeExpr)]
ns
eNames' (New _ x :: [CodeExpr]
x ns :: [(UID, CodeExpr)]
ns) = (CodeExpr -> [UID]) -> [CodeExpr] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap CodeExpr -> [UID]
eNames' [CodeExpr]
x [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ ((UID, CodeExpr) -> UID) -> [(UID, CodeExpr)] -> [UID]
forall a b. (a -> b) -> [a] -> [b]
map (UID, CodeExpr) -> UID
forall a b. (a, b) -> a
fst [(UID, CodeExpr)]
ns [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++
((UID, CodeExpr) -> [UID]) -> [(UID, CodeExpr)] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (CodeExpr -> [UID]
eNames (CodeExpr -> [UID])
-> ((UID, CodeExpr) -> CodeExpr) -> (UID, CodeExpr) -> [UID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(UID, CodeExpr) -> CodeExpr
forall a b. (a, b) -> b
snd) [(UID, CodeExpr)]
ns
eNames' (Message a :: UID
a _ x :: [CodeExpr]
x ns :: [(UID, CodeExpr)]
ns) = UID
a UID -> [UID] -> [UID]
forall a. a -> [a] -> [a]
: (CodeExpr -> [UID]) -> [CodeExpr] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap CodeExpr -> [UID]
eNames' [CodeExpr]
x [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ ((UID, CodeExpr) -> UID) -> [(UID, CodeExpr)] -> [UID]
forall a b. (a -> b) -> [a] -> [b]
map (UID, CodeExpr) -> UID
forall a b. (a, b) -> a
fst [(UID, CodeExpr)]
ns [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++
((UID, CodeExpr) -> [UID]) -> [(UID, CodeExpr)] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (CodeExpr -> [UID]
eNames (CodeExpr -> [UID])
-> ((UID, CodeExpr) -> CodeExpr) -> (UID, CodeExpr) -> [UID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(UID, CodeExpr) -> CodeExpr
forall a b. (a, b) -> b
snd) [(UID, CodeExpr)]
ns
eNames' (Field o :: UID
o f :: UID
f) = [UID
o, UID
f]
eNames' (Case _ ls :: [(CodeExpr, CodeExpr)]
ls) = ((CodeExpr, CodeExpr) -> [UID]) -> [(CodeExpr, CodeExpr)] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (CodeExpr -> [UID]
eNames' (CodeExpr -> [UID])
-> ((CodeExpr, CodeExpr) -> CodeExpr)
-> (CodeExpr, CodeExpr)
-> [UID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CodeExpr, CodeExpr) -> CodeExpr
forall a b. (a, b) -> a
fst) [(CodeExpr, CodeExpr)]
ls [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++
((CodeExpr, CodeExpr) -> [UID]) -> [(CodeExpr, CodeExpr)] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (CodeExpr -> [UID]
eNames' (CodeExpr -> [UID])
-> ((CodeExpr, CodeExpr) -> CodeExpr)
-> (CodeExpr, CodeExpr)
-> [UID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (CodeExpr, CodeExpr) -> CodeExpr
forall a b. (a, b) -> b
snd) [(CodeExpr, CodeExpr)]
ls
eNames' (UnaryOp _ u :: CodeExpr
u) = CodeExpr -> [UID]
eNames' CodeExpr
u
eNames' (UnaryOpB _ u :: CodeExpr
u) = CodeExpr -> [UID]
eNames' CodeExpr
u
eNames' (UnaryOpVV _ u :: CodeExpr
u) = CodeExpr -> [UID]
eNames' CodeExpr
u
eNames' (UnaryOpVN _ u :: CodeExpr
u) = CodeExpr -> [UID]
eNames' CodeExpr
u
eNames' (ArithBinaryOp _ a :: CodeExpr
a b :: CodeExpr
b) = CodeExpr -> [UID]
eNames' CodeExpr
a [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames' CodeExpr
b
eNames' (BoolBinaryOp _ a :: CodeExpr
a b :: CodeExpr
b) = CodeExpr -> [UID]
eNames' CodeExpr
a [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames' CodeExpr
b
eNames' (EqBinaryOp _ a :: CodeExpr
a b :: CodeExpr
b) = CodeExpr -> [UID]
eNames' CodeExpr
a [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames' CodeExpr
b
eNames' (LABinaryOp _ a :: CodeExpr
a b :: CodeExpr
b) = CodeExpr -> [UID]
eNames' CodeExpr
a [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames' CodeExpr
b
eNames' (OrdBinaryOp _ a :: CodeExpr
a b :: CodeExpr
b) = CodeExpr -> [UID]
eNames' CodeExpr
a [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames' CodeExpr
b
eNames' (VVVBinaryOp _ a :: CodeExpr
a b :: CodeExpr
b) = CodeExpr -> [UID]
eNames' CodeExpr
a [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames' CodeExpr
b
eNames' (VVNBinaryOp _ a :: CodeExpr
a b :: CodeExpr
b) = CodeExpr -> [UID]
eNames' CodeExpr
a [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames' CodeExpr
b
eNames' (Operator _ _ e :: CodeExpr
e) = CodeExpr -> [UID]
eNames' CodeExpr
e
eNames' (Matrix a :: [[CodeExpr]]
a) = ([CodeExpr] -> [UID]) -> [[CodeExpr]] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap ((CodeExpr -> [UID]) -> [CodeExpr] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap CodeExpr -> [UID]
eNames') [[CodeExpr]]
a
eNames' (RealI c :: UID
c b :: RealInterval CodeExpr CodeExpr
b) = UID
c UID -> [UID] -> [UID]
forall a. a -> [a] -> [a]
: RealInterval CodeExpr CodeExpr -> [UID]
eNamesRI' RealInterval CodeExpr CodeExpr
b
eNamesRI' :: RealInterval CodeExpr CodeExpr -> [UID]
eNamesRI' :: RealInterval CodeExpr CodeExpr -> [UID]
eNamesRI' (Bounded il :: (Inclusive, CodeExpr)
il iu :: (Inclusive, CodeExpr)
iu) = CodeExpr -> [UID]
eNames' ((Inclusive, CodeExpr) -> CodeExpr
forall a b. (a, b) -> b
snd (Inclusive, CodeExpr)
il) [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ CodeExpr -> [UID]
eNames' ((Inclusive, CodeExpr) -> CodeExpr
forall a b. (a, b) -> b
snd (Inclusive, CodeExpr)
iu)
eNamesRI' (UpTo iu :: (Inclusive, CodeExpr)
iu) = CodeExpr -> [UID]
eNames' ((Inclusive, CodeExpr) -> CodeExpr
forall a b. (a, b) -> b
snd (Inclusive, CodeExpr)
iu)
eNamesRI' (UpFrom il :: (Inclusive, CodeExpr)
il) = CodeExpr -> [UID]
eNames' ((Inclusive, CodeExpr) -> CodeExpr
forall a b. (a, b) -> b
snd (Inclusive, CodeExpr)
il)
eDep :: CodeExpr -> [UID]
eDep :: CodeExpr -> [UID]
eDep = [UID] -> [UID]
forall a. Eq a => [a] -> [a]
nub ([UID] -> [UID]) -> (CodeExpr -> [UID]) -> CodeExpr -> [UID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CodeExpr -> [UID]
eNames
eDep' :: CodeExpr -> [UID]
eDep' :: CodeExpr -> [UID]
eDep' = [UID] -> [UID]
forall a. Eq a => [a] -> [a]
nub ([UID] -> [UID]) -> (CodeExpr -> [UID]) -> CodeExpr -> [UID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CodeExpr -> [UID]
eNames'