{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE Trustworthy #-}
module Copilot.Core.External
{-# DEPRECATED "This module is deprecated in Copilot 3.10." #-}
( ExtVar (..)
, externVars
) where
import Copilot.Core.Expr
import Copilot.Core.Type
import Copilot.Core.Spec
import Data.DList (DList, empty, singleton, append, concat, toList)
import Data.List (nubBy)
import Prelude hiding (all, concat, foldr)
import Data.Typeable (Typeable)
data ExtVar = ExtVar
{ ExtVar -> Name
externVarName :: Name
, ExtVar -> UType
externVarType :: UType }
externVars :: Spec -> [ExtVar]
externVars :: Spec -> [ExtVar]
externVars = forall a. (a -> a -> Bool) -> [a] -> [a]
nubBy ExtVar -> ExtVar -> Bool
eqExt forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. DList a -> [a]
toList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall b. (forall a. Expr a -> DList b) -> Spec -> DList b
all forall a. Expr a -> DList ExtVar
externVarsExpr
where
eqExt :: ExtVar -> ExtVar -> Bool
eqExt :: ExtVar -> ExtVar -> Bool
eqExt ExtVar { externVarName :: ExtVar -> Name
externVarName = Name
name1 } ExtVar { externVarName :: ExtVar -> Name
externVarName = Name
name2 } =
Name
name1 forall a. Eq a => a -> a -> Bool
== Name
name2
externVarsExpr :: Expr a -> DList ExtVar
externVarsExpr :: forall a. Expr a -> DList ExtVar
externVarsExpr Expr a
e0 = case Expr a
e0 of
Const Type a
_ a
_ -> forall a. DList a
empty
Drop Type a
_ DropIdx
_ Id
_ -> forall a. DList a
empty
Local Type a
_ Type a
_ Name
_ Expr a
e1 Expr a
e2 -> forall a. Expr a -> DList ExtVar
externVarsExpr Expr a
e1 forall a. DList a -> DList a -> DList a
`append` forall a. Expr a -> DList ExtVar
externVarsExpr Expr a
e2
Var Type a
_ Name
_ -> forall a. DList a
empty
ExternVar Type a
t Name
name Maybe [a]
_ -> forall a. a -> DList a
singleton (Name -> UType -> ExtVar
ExtVar Name
name (forall a. Typeable a => Type a -> UType
UType Type a
t))
Op1 Op1 a a
_ Expr a
e -> forall a. Expr a -> DList ExtVar
externVarsExpr Expr a
e
Op2 Op2 a b a
_ Expr a
e1 Expr b
e2 -> forall a. Expr a -> DList ExtVar
externVarsExpr Expr a
e1 forall a. DList a -> DList a -> DList a
`append` forall a. Expr a -> DList ExtVar
externVarsExpr Expr b
e2
Op3 Op3 a b c a
_ Expr a
e1 Expr b
e2 Expr c
e3 -> forall a. Expr a -> DList ExtVar
externVarsExpr Expr a
e1 forall a. DList a -> DList a -> DList a
`append`
forall a. Expr a -> DList ExtVar
externVarsExpr Expr b
e2 forall a. DList a -> DList a -> DList a
`append`
forall a. Expr a -> DList ExtVar
externVarsExpr Expr c
e3
Label Type a
_ Name
_ Expr a
e -> forall a. Expr a -> DList ExtVar
externVarsExpr Expr a
e
externVarsUExpr :: UExpr -> DList ExtVar
externVarsUExpr :: UExpr -> DList ExtVar
externVarsUExpr UExpr { uExprExpr :: ()
uExprExpr = Expr a
e } = forall a. Expr a -> DList ExtVar
externVarsExpr Expr a
e
all :: (forall a . Expr a -> DList b) -> Spec -> DList b
all :: forall b. (forall a. Expr a -> DList b) -> Spec -> DList b
all forall a. Expr a -> DList b
f Spec
spec =
forall a. [DList a] -> DList a
concat (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Stream -> DList b
allStream) (Spec -> [Stream]
specStreams Spec
spec)) forall a. DList a -> DList a -> DList a
`append`
forall a. [DList a] -> DList a
concat (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Trigger -> DList b
allTrigger (Spec -> [Trigger]
specTriggers Spec
spec)) forall a. DList a -> DList a -> DList a
`append`
forall a. [DList a] -> DList a
concat (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Observer -> DList b
allObserver (Spec -> [Observer]
specObservers Spec
spec))
where
allStream :: Stream -> DList b
allStream
Stream { streamExpr :: ()
streamExpr = Expr a
e } = forall a. Expr a -> DList b
f Expr a
e
allTrigger :: Trigger -> DList b
allTrigger
Trigger
{ triggerGuard :: Trigger -> Expr Bool
triggerGuard = Expr Bool
e
, triggerArgs :: Trigger -> [UExpr]
triggerArgs = [UExpr]
args } = forall a. Expr a -> DList b
f Expr Bool
e forall a. DList a -> DList a -> DList a
`append` forall a. [DList a] -> DList a
concat (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap UExpr -> DList b
allUExpr [UExpr]
args)
allUExpr :: UExpr -> DList b
allUExpr
(UExpr Type a
_ Expr a
e1) = forall a. Expr a -> DList b
f Expr a
e1
allObserver :: Observer -> DList b
allObserver
Observer { observerExpr :: ()
observerExpr = Expr a
e } = forall a. Expr a -> DList b
f Expr a
e