{-# LANGUAGE TemplateHaskell, Rank2Types, ScopedTypeVariables, MultiParamTypeClasses #-}
module Theory.Drasil.InstanceModel(
InstanceModel
, im, imNoDeriv, imNoRefs, imNoDerivNoRefs
, getEqModQdsFromIm
, qwUC, qwC
) where
import Language.Drasil
import Language.Drasil.Development (showUID)
import Theory.Drasil.Classes (HasInputs(inputs), HasOutput(..))
import Data.Drasil.TheoryConcepts (inModel)
import Control.Lens ((^.), makeLenses, _1, _2)
import Theory.Drasil.ModelKinds (ModelKind, getEqModQds)
type Input = (QuantityDict, Maybe (RealInterval Expr Expr))
type Inputs = [Input]
type Output = QuantityDict
type OutputConstraints = [RealInterval Expr Expr]
data InstanceModel = IM {
InstanceModel -> ModelKind Expr
_mk :: ModelKind Expr
, InstanceModel -> Inputs
_imInputs :: Inputs
, InstanceModel -> (Output, OutputConstraints)
_imOutput :: (Output, OutputConstraints)
, InstanceModel -> [DecRef]
_rf :: [DecRef]
, InstanceModel -> Maybe Derivation
_deri :: Maybe Derivation
, InstanceModel -> ShortName
lb :: ShortName
, InstanceModel -> String
ra :: String
, InstanceModel -> [Sentence]
_notes :: [Sentence]
}
makeLenses ''InstanceModel
instance HasUID InstanceModel where uid :: Lens' InstanceModel UID
uid = Lens' InstanceModel (ModelKind Expr)
mk forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c. HasUID c => Lens' c UID
uid
instance NamedIdea InstanceModel where term :: Lens' InstanceModel NP
term = Lens' InstanceModel (ModelKind Expr)
mk forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c. NamedIdea c => Lens' c NP
term
instance Idea InstanceModel where getA :: InstanceModel -> Maybe String
getA = forall c. Idea c => c -> Maybe String
getA forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall s a. s -> Getting a s a -> a
^. Lens' InstanceModel (ModelKind Expr)
mk)
instance Definition InstanceModel where defn :: Lens' InstanceModel Sentence
defn = Lens' InstanceModel (ModelKind Expr)
mk forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c. Definition c => Lens' c Sentence
defn
instance ConceptDomain InstanceModel where cdom :: InstanceModel -> [UID]
cdom = forall c. ConceptDomain c => c -> [UID]
cdom forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall s a. s -> Getting a s a -> a
^. Lens' InstanceModel (ModelKind Expr)
mk)
instance Express InstanceModel where express :: InstanceModel -> ModelExpr
express = forall c. Express c => c -> ModelExpr
express forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall s a. s -> Getting a s a -> a
^. Lens' InstanceModel (ModelKind Expr)
mk)
instance MayHaveDerivation InstanceModel where derivations :: Lens' InstanceModel (Maybe Derivation)
derivations = Lens' InstanceModel (Maybe Derivation)
deri
instance HasDecRef InstanceModel where getDecRefs :: Lens' InstanceModel [DecRef]
getDecRefs = Lens' InstanceModel [DecRef]
rf
instance HasShortName InstanceModel where shortname :: InstanceModel -> ShortName
shortname = InstanceModel -> ShortName
lb
instance HasRefAddress InstanceModel where getRefAdd :: InstanceModel -> LblType
getRefAdd InstanceModel
l = IRefProg -> String -> LblType
RP (String -> IRefProg
prepend forall a b. (a -> b) -> a -> b
$ forall c. CommonIdea c => c -> String
abrv InstanceModel
l) (InstanceModel -> String
ra InstanceModel
l)
instance HasAdditionalNotes InstanceModel where getNotes :: Lens' InstanceModel [Sentence]
getNotes = Lens' InstanceModel [Sentence]
notes
instance CommonIdea InstanceModel where abrv :: InstanceModel -> String
abrv InstanceModel
_ = forall c. CommonIdea c => c -> String
abrv CI
inModel
instance Referable InstanceModel where
refAdd :: InstanceModel -> String
refAdd = InstanceModel -> String
ra
renderRef :: InstanceModel -> LblType
renderRef InstanceModel
l = IRefProg -> String -> LblType
RP (String -> IRefProg
prepend forall a b. (a -> b) -> a -> b
$ forall c. CommonIdea c => c -> String
abrv InstanceModel
l) (forall s. Referable s => s -> String
refAdd InstanceModel
l)
instance DefinesQuantity InstanceModel where
defLhs :: Getter InstanceModel Output
defLhs = Lens' InstanceModel (Output, OutputConstraints)
imOutput forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s t a b. Field1 s t a b => Lens s t a b
_1
instance HasInputs InstanceModel where
inputs :: Lens' InstanceModel Inputs
inputs = Lens' InstanceModel Inputs
imInputs
instance HasOutput InstanceModel where
output :: Getter InstanceModel Output
output = Lens' InstanceModel (Output, OutputConstraints)
imOutput forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s t a b. Field1 s t a b => Lens s t a b
_1
out_constraints :: Getter InstanceModel OutputConstraints
out_constraints = Lens' InstanceModel (Output, OutputConstraints)
imOutput forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s t a b. Field2 s t a b => Lens s t a b
_2
instance RequiresChecking InstanceModel Expr Space where
requiredChecks :: InstanceModel -> [(Expr, Space)]
requiredChecks = forall c e t. RequiresChecking c e t => c -> [(e, t)]
requiredChecks forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall s a. s -> Getting a s a -> a
^. Lens' InstanceModel (ModelKind Expr)
mk)
im :: ModelKind Expr -> Inputs -> Output ->
OutputConstraints -> [DecRef] -> Maybe Derivation -> String -> [Sentence] -> InstanceModel
im :: ModelKind Expr
-> Inputs
-> Output
-> OutputConstraints
-> [DecRef]
-> Maybe Derivation
-> String
-> [Sentence]
-> InstanceModel
im ModelKind Expr
mkind Inputs
_ Output
_ OutputConstraints
_ [] Maybe Derivation
_ String
_ = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"Source field of " forall a. [a] -> [a] -> [a]
++ forall a. HasUID a => a -> String
showUID ModelKind Expr
mkind forall a. [a] -> [a] -> [a]
++ String
" is empty"
im ModelKind Expr
mkind Inputs
i Output
o OutputConstraints
oc [DecRef]
r Maybe Derivation
der String
sn =
ModelKind Expr
-> Inputs
-> (Output, OutputConstraints)
-> [DecRef]
-> Maybe Derivation
-> ShortName
-> String
-> [Sentence]
-> InstanceModel
IM ModelKind Expr
mkind Inputs
i (Output
o, OutputConstraints
oc) [DecRef]
r Maybe Derivation
der (Sentence -> ShortName
shortname' forall a b. (a -> b) -> a -> b
$ String -> Sentence
S String
sn) (forall c. CommonIdea c => c -> String -> String
prependAbrv CI
inModel String
sn)
imNoDeriv :: ModelKind Expr -> Inputs -> Output ->
OutputConstraints -> [DecRef] -> String -> [Sentence] -> InstanceModel
imNoDeriv :: ModelKind Expr
-> Inputs
-> Output
-> OutputConstraints
-> [DecRef]
-> String
-> [Sentence]
-> InstanceModel
imNoDeriv ModelKind Expr
mkind Inputs
_ Output
_ OutputConstraints
_ [] String
_ = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"Source field of " forall a. [a] -> [a] -> [a]
++ forall a. HasUID a => a -> String
showUID ModelKind Expr
mkind forall a. [a] -> [a] -> [a]
++ String
" is empty"
imNoDeriv ModelKind Expr
mkind Inputs
i Output
o OutputConstraints
oc [DecRef]
r String
sn =
ModelKind Expr
-> Inputs
-> (Output, OutputConstraints)
-> [DecRef]
-> Maybe Derivation
-> ShortName
-> String
-> [Sentence]
-> InstanceModel
IM ModelKind Expr
mkind Inputs
i (Output
o, OutputConstraints
oc) [DecRef]
r forall a. Maybe a
Nothing (Sentence -> ShortName
shortname' forall a b. (a -> b) -> a -> b
$ String -> Sentence
S String
sn) (forall c. CommonIdea c => c -> String -> String
prependAbrv CI
inModel String
sn)
imNoRefs :: ModelKind Expr -> Inputs -> Output ->
OutputConstraints -> Maybe Derivation -> String -> [Sentence] -> InstanceModel
imNoRefs :: ModelKind Expr
-> Inputs
-> Output
-> OutputConstraints
-> Maybe Derivation
-> String
-> [Sentence]
-> InstanceModel
imNoRefs ModelKind Expr
mkind Inputs
i Output
o OutputConstraints
oc Maybe Derivation
der String
sn =
ModelKind Expr
-> Inputs
-> (Output, OutputConstraints)
-> [DecRef]
-> Maybe Derivation
-> ShortName
-> String
-> [Sentence]
-> InstanceModel
IM ModelKind Expr
mkind Inputs
i (Output
o, OutputConstraints
oc) [] Maybe Derivation
der (Sentence -> ShortName
shortname' forall a b. (a -> b) -> a -> b
$ String -> Sentence
S String
sn) (forall c. CommonIdea c => c -> String -> String
prependAbrv CI
inModel String
sn)
imNoDerivNoRefs :: ModelKind Expr -> Inputs -> Output ->
OutputConstraints -> String -> [Sentence] -> InstanceModel
imNoDerivNoRefs :: ModelKind Expr
-> Inputs
-> Output
-> OutputConstraints
-> String
-> [Sentence]
-> InstanceModel
imNoDerivNoRefs ModelKind Expr
mkind Inputs
i Output
o OutputConstraints
oc String
sn =
ModelKind Expr
-> Inputs
-> (Output, OutputConstraints)
-> [DecRef]
-> Maybe Derivation
-> ShortName
-> String
-> [Sentence]
-> InstanceModel
IM ModelKind Expr
mkind Inputs
i (Output
o, OutputConstraints
oc) [] forall a. Maybe a
Nothing (Sentence -> ShortName
shortname' forall a b. (a -> b) -> a -> b
$ String -> Sentence
S String
sn) (forall c. CommonIdea c => c -> String -> String
prependAbrv CI
inModel String
sn)
qwUC :: (Quantity q, MayHaveUnit q) => q -> Input
qwUC :: forall q. (Quantity q, MayHaveUnit q) => q -> Input
qwUC q
x = (forall q. (Quantity q, MayHaveUnit q) => q -> Output
qw q
x, forall a. Maybe a
Nothing)
qwC :: (Quantity q, MayHaveUnit q) => q -> RealInterval Expr Expr -> Input
qwC :: forall q.
(Quantity q, MayHaveUnit q) =>
q -> RealInterval Expr Expr -> Input
qwC q
x RealInterval Expr Expr
y = (forall q. (Quantity q, MayHaveUnit q) => q -> Output
qw q
x, forall a. a -> Maybe a
Just RealInterval Expr Expr
y)
getEqModQdsFromIm :: [InstanceModel] -> [SimpleQDef]
getEqModQdsFromIm :: [InstanceModel] -> [SimpleQDef]
getEqModQdsFromIm [InstanceModel]
ims = forall e. [ModelKind e] -> [QDefinition e]
getEqModQds (forall a b. (a -> b) -> [a] -> [b]
map InstanceModel -> ModelKind Expr
_mk [InstanceModel]
ims)