{-# LANGUAGE TemplateHaskell #-}
module Theory.Drasil.GenDefn (
GenDefn,
gd, gdNoRefs,
getEqModQdsFromGd
) where
import Control.Lens ((^.), view, makeLenses)
import Drasil.Database (HasUID(..), showUID, declareHasChunkRefs, Generically(..))
import Language.Drasil
import Language.Drasil.Document
import Drasil.Metadata.TheoryConcepts (genDefn)
import Theory.Drasil.Components.Derivation (Derivation, MayHaveDerivation(derivations))
import Theory.Drasil.ModelKinds (ModelKind, getEqModQds)
data GenDefn = GD { GenDefn -> ModelKind ModelExpr
_mk :: ModelKind ModelExpr
, GenDefn -> Maybe UnitDefn
gdUnit :: Maybe UnitDefn
, GenDefn -> Maybe Derivation
_deri :: Maybe Derivation
, GenDefn -> [DecRef]
_rf :: [DecRef]
, GenDefn -> ShortName
_sn :: ShortName
, GenDefn -> [Char]
_ra :: String
, GenDefn -> [Sentence]
_notes :: [Sentence]
}
makeLenses ''GenDefn
declareHasChunkRefs ''GenDefn
instance HasUID GenDefn where uid :: Getter GenDefn UID
uid = (ModelKind ModelExpr -> f (ModelKind ModelExpr))
-> GenDefn -> f GenDefn
Lens' GenDefn (ModelKind ModelExpr)
mk ((ModelKind ModelExpr -> f (ModelKind ModelExpr))
-> GenDefn -> f GenDefn)
-> ((UID -> f UID)
-> ModelKind ModelExpr -> f (ModelKind ModelExpr))
-> (UID -> f UID)
-> GenDefn
-> f GenDefn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (UID -> f UID) -> ModelKind ModelExpr -> f (ModelKind ModelExpr)
forall c. HasUID c => Getter c UID
Getter (ModelKind ModelExpr) UID
uid
instance NamedIdea GenDefn where term :: Lens' GenDefn NP
term = (ModelKind ModelExpr -> f (ModelKind ModelExpr))
-> GenDefn -> f GenDefn
Lens' GenDefn (ModelKind ModelExpr)
mk ((ModelKind ModelExpr -> f (ModelKind ModelExpr))
-> GenDefn -> f GenDefn)
-> ((NP -> f NP) -> ModelKind ModelExpr -> f (ModelKind ModelExpr))
-> (NP -> f NP)
-> GenDefn
-> f GenDefn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (NP -> f NP) -> ModelKind ModelExpr -> f (ModelKind ModelExpr)
forall c. NamedIdea c => Lens' c NP
Lens' (ModelKind ModelExpr) NP
term
instance Idea GenDefn where getA :: GenDefn -> Maybe [Char]
getA = ModelKind ModelExpr -> Maybe [Char]
forall c. Idea c => c -> Maybe [Char]
getA (ModelKind ModelExpr -> Maybe [Char])
-> (GenDefn -> ModelKind ModelExpr) -> GenDefn -> Maybe [Char]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GenDefn
-> Getting (ModelKind ModelExpr) GenDefn (ModelKind ModelExpr)
-> ModelKind ModelExpr
forall s a. s -> Getting a s a -> a
^. Getting (ModelKind ModelExpr) GenDefn (ModelKind ModelExpr)
Lens' GenDefn (ModelKind ModelExpr)
mk)
instance Definition GenDefn where defn :: Lens' GenDefn Sentence
defn = (ModelKind ModelExpr -> f (ModelKind ModelExpr))
-> GenDefn -> f GenDefn
Lens' GenDefn (ModelKind ModelExpr)
mk ((ModelKind ModelExpr -> f (ModelKind ModelExpr))
-> GenDefn -> f GenDefn)
-> ((Sentence -> f Sentence)
-> ModelKind ModelExpr -> f (ModelKind ModelExpr))
-> (Sentence -> f Sentence)
-> GenDefn
-> f GenDefn
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Sentence -> f Sentence)
-> ModelKind ModelExpr -> f (ModelKind ModelExpr)
forall c. Definition c => Lens' c Sentence
Lens' (ModelKind ModelExpr) Sentence
defn
instance Express GenDefn where express :: GenDefn -> ModelExpr
express = ModelKind ModelExpr -> ModelExpr
forall c. Express c => c -> ModelExpr
express (ModelKind ModelExpr -> ModelExpr)
-> (GenDefn -> ModelKind ModelExpr) -> GenDefn -> ModelExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GenDefn
-> Getting (ModelKind ModelExpr) GenDefn (ModelKind ModelExpr)
-> ModelKind ModelExpr
forall s a. s -> Getting a s a -> a
^. Getting (ModelKind ModelExpr) GenDefn (ModelKind ModelExpr)
Lens' GenDefn (ModelKind ModelExpr)
mk)
instance MayHaveDerivation GenDefn where derivations :: Lens' GenDefn (Maybe Derivation)
derivations = (Maybe Derivation -> f (Maybe Derivation)) -> GenDefn -> f GenDefn
Lens' GenDefn (Maybe Derivation)
deri
instance HasDecRef GenDefn where getDecRefs :: Lens' GenDefn [DecRef]
getDecRefs = ([DecRef] -> f [DecRef]) -> GenDefn -> f GenDefn
Lens' GenDefn [DecRef]
rf
instance HasShortName GenDefn where shortname :: GenDefn -> ShortName
shortname = Getting ShortName GenDefn ShortName -> GenDefn -> ShortName
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting ShortName GenDefn ShortName
Lens' GenDefn ShortName
sn
instance HasRefAddress GenDefn where getRefAdd :: GenDefn -> LblType
getRefAdd GenDefn
l = IRefProg -> [Char] -> LblType
RP ([Char] -> IRefProg
prepend ([Char] -> IRefProg) -> [Char] -> IRefProg
forall a b. (a -> b) -> a -> b
$ GenDefn -> [Char]
forall c. CommonIdea c => c -> [Char]
abrv GenDefn
l) (Getting [Char] GenDefn [Char] -> GenDefn -> [Char]
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting [Char] GenDefn [Char]
Lens' GenDefn [Char]
ra GenDefn
l)
instance HasAdditionalNotes GenDefn where getNotes :: Lens' GenDefn [Sentence]
getNotes = ([Sentence] -> f [Sentence]) -> GenDefn -> f GenDefn
Lens' GenDefn [Sentence]
notes
instance MayHaveUnit GenDefn where getUnit :: GenDefn -> Maybe UnitDefn
getUnit = GenDefn -> Maybe UnitDefn
gdUnit
instance CommonIdea GenDefn where abrv :: GenDefn -> [Char]
abrv GenDefn
_ = CI -> [Char]
forall c. CommonIdea c => c -> [Char]
abrv CI
genDefn
instance Referable GenDefn where
refAdd :: GenDefn -> [Char]
refAdd = Getting [Char] GenDefn [Char] -> GenDefn -> [Char]
forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Getting [Char] GenDefn [Char]
Lens' GenDefn [Char]
ra
renderRef :: GenDefn -> LblType
renderRef GenDefn
l = IRefProg -> [Char] -> LblType
RP ([Char] -> IRefProg
prepend ([Char] -> IRefProg) -> [Char] -> IRefProg
forall a b. (a -> b) -> a -> b
$ GenDefn -> [Char]
forall c. CommonIdea c => c -> [Char]
abrv GenDefn
l) (GenDefn -> [Char]
forall s. Referable s => s -> [Char]
refAdd GenDefn
l)
gd :: ModelKind ModelExpr -> Maybe UnitDefn ->
Maybe Derivation -> [DecRef] -> String -> [Sentence] -> GenDefn
gd :: ModelKind ModelExpr
-> Maybe UnitDefn
-> Maybe Derivation
-> [DecRef]
-> [Char]
-> [Sentence]
-> GenDefn
gd ModelKind ModelExpr
mkind Maybe UnitDefn
_ Maybe Derivation
_ [] [Char]
_ = [Char] -> [Sentence] -> GenDefn
forall a. HasCallStack => [Char] -> a
error ([Char] -> [Sentence] -> GenDefn)
-> [Char] -> [Sentence] -> GenDefn
forall a b. (a -> b) -> a -> b
$ [Char]
"Source field of " [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> ModelKind ModelExpr -> [Char]
forall a. HasUID a => a -> [Char]
showUID ModelKind ModelExpr
mkind [Char] -> [Char] -> [Char]
forall a. Semigroup a => a -> a -> a
<> [Char]
" is empty"
gd ModelKind ModelExpr
mkind Maybe UnitDefn
u Maybe Derivation
derivs [DecRef]
refs [Char]
sn_ =
ModelKind ModelExpr
-> Maybe UnitDefn
-> Maybe Derivation
-> [DecRef]
-> ShortName
-> [Char]
-> [Sentence]
-> GenDefn
GD ModelKind ModelExpr
mkind Maybe UnitDefn
u Maybe Derivation
derivs [DecRef]
refs (Sentence -> ShortName
shortname' (Sentence -> ShortName) -> Sentence -> ShortName
forall a b. (a -> b) -> a -> b
$ [Char] -> Sentence
S [Char]
sn_) (CI -> [Char] -> [Char]
forall c. CommonIdea c => c -> [Char] -> [Char]
prependAbrv CI
genDefn [Char]
sn_)
gdNoRefs :: ModelKind ModelExpr -> Maybe UnitDefn ->
Maybe Derivation -> String -> [Sentence] -> GenDefn
gdNoRefs :: ModelKind ModelExpr
-> Maybe UnitDefn
-> Maybe Derivation
-> [Char]
-> [Sentence]
-> GenDefn
gdNoRefs ModelKind ModelExpr
mkind Maybe UnitDefn
u Maybe Derivation
derivs [Char]
sn_ =
ModelKind ModelExpr
-> Maybe UnitDefn
-> Maybe Derivation
-> [DecRef]
-> ShortName
-> [Char]
-> [Sentence]
-> GenDefn
GD ModelKind ModelExpr
mkind Maybe UnitDefn
u Maybe Derivation
derivs [] (Sentence -> ShortName
shortname' (Sentence -> ShortName) -> Sentence -> ShortName
forall a b. (a -> b) -> a -> b
$ [Char] -> Sentence
S [Char]
sn_) (CI -> [Char] -> [Char]
forall c. CommonIdea c => c -> [Char] -> [Char]
prependAbrv CI
genDefn [Char]
sn_)
getEqModQdsFromGd :: [GenDefn] -> [ModelQDef]
getEqModQdsFromGd :: [GenDefn] -> [ModelQDef]
getEqModQdsFromGd = [ModelKind ModelExpr] -> [ModelQDef]
forall e. [ModelKind e] -> [QDefinition e]
getEqModQds ([ModelKind ModelExpr] -> [ModelQDef])
-> ([GenDefn] -> [ModelKind ModelExpr]) -> [GenDefn] -> [ModelQDef]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GenDefn -> ModelKind ModelExpr)
-> [GenDefn] -> [ModelKind ModelExpr]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GenDefn -> ModelKind ModelExpr
_mk