{-# Language TemplateHaskell #-}
module Language.Drasil.Chunk.Constrained (
ConstrainedChunk(..), cuc, cvc, cnstrw,
ConstrConcept(..),
cnstrw', constrained', constrainedNRV', cuc', cuc'') where
import Control.Lens ((^.), makeLenses, view)
import Language.Drasil.Chunk.Concept (cw, dcc)
import Language.Drasil.Chunk.DefinedQuantity (DefinedQuantityDict, dqd, dqd', dqdWr)
import Language.Drasil.Chunk.Quantity (QuantityDict, qw, vc)
import Language.Drasil.Chunk.Unital (uc')
import Language.Drasil.Chunk.Unitary (unitary)
import Language.Drasil.Symbol (HasSymbol(..), Symbol)
import Language.Drasil.Classes (NamedIdea(term), Idea(getA), Express(express),
Definition(defn), ConceptDomain(cdom), Concept, Quantity,
IsUnit, Constrained(constraints), HasReasVal(reasVal))
import Language.Drasil.Constraint (ConstraintE)
import Language.Drasil.Chunk.UnitDefn (unitWrapper, MayHaveUnit(getUnit))
import Language.Drasil.Expr.Lang (Expr(..))
import Language.Drasil.Expr.Class (sy)
import Language.Drasil.NounPhrase.Core (NP)
import Language.Drasil.Sentence (Sentence(S))
import Language.Drasil.Space (Space, HasSpace(..))
import Language.Drasil.Stages (Stage)
import Language.Drasil.UID (HasUID(..))
data ConstrainedChunk = ConstrainedChunk { ConstrainedChunk -> QuantityDict
_qd :: QuantityDict
, ConstrainedChunk -> [ConstraintE]
_constr :: [ConstraintE]
, ConstrainedChunk -> Maybe Expr
_reasV :: Maybe Expr
}
makeLenses ''ConstrainedChunk
instance HasUID ConstrainedChunk where uid :: Lens' ConstrainedChunk UID
uid = Lens' ConstrainedChunk QuantityDict
qd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c. HasUID c => Lens' c UID
uid
instance NamedIdea ConstrainedChunk where term :: Lens' ConstrainedChunk NP
term = Lens' ConstrainedChunk QuantityDict
qd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c. NamedIdea c => Lens' c NP
term
instance Idea ConstrainedChunk where getA :: ConstrainedChunk -> Maybe String
getA = forall c. Idea c => c -> Maybe String
getA forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Lens' ConstrainedChunk QuantityDict
qd
instance HasSpace ConstrainedChunk where typ :: Getter ConstrainedChunk Space
typ = Lens' ConstrainedChunk QuantityDict
qd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c. HasSpace c => Getter c Space
typ
instance HasSymbol ConstrainedChunk where symbol :: ConstrainedChunk -> Stage -> Symbol
symbol ConstrainedChunk
c = forall c. HasSymbol c => c -> Stage -> Symbol
symbol (ConstrainedChunk
cforall s a. s -> Getting a s a -> a
^.Lens' ConstrainedChunk QuantityDict
qd)
instance Quantity ConstrainedChunk where
instance Constrained ConstrainedChunk where constraints :: Lens' ConstrainedChunk [ConstraintE]
constraints = Lens' ConstrainedChunk [ConstraintE]
constr
instance HasReasVal ConstrainedChunk where reasVal :: Lens' ConstrainedChunk (Maybe Expr)
reasVal = Lens' ConstrainedChunk (Maybe Expr)
reasV
instance Eq ConstrainedChunk where ConstrainedChunk
c1 == :: ConstrainedChunk -> ConstrainedChunk -> Bool
== ConstrainedChunk
c2 = (ConstrainedChunk
c1 forall s a. s -> Getting a s a -> a
^. Lens' ConstrainedChunk QuantityDict
qd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c. HasUID c => Lens' c UID
uid) forall a. Eq a => a -> a -> Bool
== (ConstrainedChunk
c2 forall s a. s -> Getting a s a -> a
^. Lens' ConstrainedChunk QuantityDict
qd forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c. HasUID c => Lens' c UID
uid)
instance MayHaveUnit ConstrainedChunk where getUnit :: ConstrainedChunk -> Maybe UnitDefn
getUnit = forall u. MayHaveUnit u => u -> Maybe UnitDefn
getUnit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Lens' ConstrainedChunk QuantityDict
qd
cuc :: (IsUnit u) => String -> NP -> Symbol -> u
-> Space -> [ConstraintE] -> Expr -> ConstrainedChunk
cuc :: forall u.
IsUnit u =>
String
-> NP
-> Symbol
-> u
-> Space
-> [ConstraintE]
-> Expr
-> ConstrainedChunk
cuc String
i NP
t Symbol
s u
u Space
space [ConstraintE]
cs Expr
rv = QuantityDict -> [ConstraintE] -> Maybe Expr -> ConstrainedChunk
ConstrainedChunk (forall q. (Quantity q, MayHaveUnit q) => q -> QuantityDict
qw (forall u.
IsUnit u =>
String -> NP -> Symbol -> u -> Space -> UnitaryChunk
unitary String
i NP
t Symbol
s u
u Space
space)) [ConstraintE]
cs (forall a. a -> Maybe a
Just Expr
rv)
cvc :: String -> NP -> Symbol -> Space -> [ConstraintE] -> Maybe Expr -> ConstrainedChunk
cvc :: String
-> NP
-> Symbol
-> Space
-> [ConstraintE]
-> Maybe Expr
-> ConstrainedChunk
cvc String
i NP
des Symbol
sym Space
space = QuantityDict -> [ConstraintE] -> Maybe Expr -> ConstrainedChunk
ConstrainedChunk (forall q. (Quantity q, MayHaveUnit q) => q -> QuantityDict
qw (String -> NP -> Symbol -> Space -> QuantityDict
vc String
i NP
des Symbol
sym Space
space))
cnstrw :: (Quantity c, Constrained c, HasReasVal c, MayHaveUnit c) => c -> ConstrainedChunk
cnstrw :: forall c.
(Quantity c, Constrained c, HasReasVal c, MayHaveUnit c) =>
c -> ConstrainedChunk
cnstrw c
c = QuantityDict -> [ConstraintE] -> Maybe Expr -> ConstrainedChunk
ConstrainedChunk (forall q. (Quantity q, MayHaveUnit q) => q -> QuantityDict
qw c
c) (c
c forall s a. s -> Getting a s a -> a
^. forall c. Constrained c => Lens' c [ConstraintE]
constraints) (c
c forall s a. s -> Getting a s a -> a
^. forall c. HasReasVal c => Lens' c (Maybe Expr)
reasVal)
data ConstrConcept = ConstrConcept { ConstrConcept -> DefinedQuantityDict
_defq :: DefinedQuantityDict
, ConstrConcept -> [ConstraintE]
_constr' :: [ConstraintE]
, ConstrConcept -> Maybe Expr
_reasV' :: Maybe Expr
}
makeLenses ''ConstrConcept
instance HasUID ConstrConcept where uid :: Lens' ConstrConcept UID
uid = Lens' ConstrConcept DefinedQuantityDict
defq forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c. HasUID c => Lens' c UID
uid
instance NamedIdea ConstrConcept where term :: Lens' ConstrConcept NP
term = Lens' ConstrConcept DefinedQuantityDict
defq forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c. NamedIdea c => Lens' c NP
term
instance Idea ConstrConcept where getA :: ConstrConcept -> Maybe String
getA = forall c. Idea c => c -> Maybe String
getA forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Lens' ConstrConcept DefinedQuantityDict
defq
instance HasSpace ConstrConcept where typ :: Getter ConstrConcept Space
typ = Lens' ConstrConcept DefinedQuantityDict
defq forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c. HasSpace c => Getter c Space
typ
instance HasSymbol ConstrConcept where symbol :: ConstrConcept -> Stage -> Symbol
symbol ConstrConcept
c = forall c. HasSymbol c => c -> Stage -> Symbol
symbol (ConstrConcept
cforall s a. s -> Getting a s a -> a
^.Lens' ConstrConcept DefinedQuantityDict
defq)
instance Quantity ConstrConcept where
instance Definition ConstrConcept where defn :: Lens' ConstrConcept Sentence
defn = Lens' ConstrConcept DefinedQuantityDict
defq forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall c. Definition c => Lens' c Sentence
defn
instance ConceptDomain ConstrConcept where cdom :: ConstrConcept -> [UID]
cdom = forall c. ConceptDomain c => c -> [UID]
cdom forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Lens' ConstrConcept DefinedQuantityDict
defq
instance Constrained ConstrConcept where constraints :: Lens' ConstrConcept [ConstraintE]
constraints = Lens' ConstrConcept [ConstraintE]
constr'
instance HasReasVal ConstrConcept where reasVal :: Lens' ConstrConcept (Maybe Expr)
reasVal = Lens' ConstrConcept (Maybe Expr)
reasV'
instance Eq ConstrConcept where ConstrConcept
c1 == :: ConstrConcept -> ConstrConcept -> Bool
== ConstrConcept
c2 = (ConstrConcept
c1 forall s a. s -> Getting a s a -> a
^.Lens' ConstrConcept DefinedQuantityDict
defqforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall c. HasUID c => Lens' c UID
uid) forall a. Eq a => a -> a -> Bool
== (ConstrConcept
c2 forall s a. s -> Getting a s a -> a
^.Lens' ConstrConcept DefinedQuantityDict
defqforall b c a. (b -> c) -> (a -> b) -> a -> c
.forall c. HasUID c => Lens' c UID
uid)
instance MayHaveUnit ConstrConcept where getUnit :: ConstrConcept -> Maybe UnitDefn
getUnit = forall u. MayHaveUnit u => u -> Maybe UnitDefn
getUnit forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall s (m :: * -> *) a. MonadReader s m => Getting a s a -> m a
view Lens' ConstrConcept DefinedQuantityDict
defq
instance Express ConstrConcept where express :: ConstrConcept -> ModelExpr
express = forall r c. (ExprC r, HasUID c, HasSymbol c) => c -> r
sy
constrained' :: (Concept c, MayHaveUnit c, Quantity c) =>
c -> [ConstraintE] -> Expr -> ConstrConcept
constrained' :: forall c.
(Concept c, MayHaveUnit c, Quantity c) =>
c -> [ConstraintE] -> Expr -> ConstrConcept
constrained' c
q [ConstraintE]
cs Expr
rv = DefinedQuantityDict -> [ConstraintE] -> Maybe Expr -> ConstrConcept
ConstrConcept (forall c.
(Quantity c, Concept c, MayHaveUnit c) =>
c -> DefinedQuantityDict
dqdWr c
q) [ConstraintE]
cs (forall a. a -> Maybe a
Just Expr
rv)
constrainedNRV' :: (Concept c, MayHaveUnit c, Quantity c) =>
c -> [ConstraintE] -> ConstrConcept
constrainedNRV' :: forall c.
(Concept c, MayHaveUnit c, Quantity c) =>
c -> [ConstraintE] -> ConstrConcept
constrainedNRV' c
q [ConstraintE]
cs = DefinedQuantityDict -> [ConstraintE] -> Maybe Expr -> ConstrConcept
ConstrConcept (forall c.
(Quantity c, Concept c, MayHaveUnit c) =>
c -> DefinedQuantityDict
dqdWr c
q) [ConstraintE]
cs forall a. Maybe a
Nothing
cuc' :: (IsUnit u) => String -> NP -> String -> Symbol -> u
-> Space -> [ConstraintE] -> Expr -> ConstrConcept
cuc' :: forall u.
IsUnit u =>
String
-> NP
-> String
-> Symbol
-> u
-> Space
-> [ConstraintE]
-> Expr
-> ConstrConcept
cuc' String
nam NP
trm String
desc Symbol
sym u
un Space
space [ConstraintE]
cs Expr
rv =
DefinedQuantityDict -> [ConstraintE] -> Maybe Expr -> ConstrConcept
ConstrConcept (forall u.
IsUnit u =>
ConceptChunk -> Symbol -> Space -> u -> DefinedQuantityDict
dqd (forall c. Concept c => c -> ConceptChunk
cw (forall u.
IsUnit u =>
String -> NP -> Sentence -> Symbol -> Space -> u -> UnitalChunk
uc' String
nam NP
trm (String -> Sentence
S String
desc) Symbol
sym Space
space u
un)) Symbol
sym Space
space UnitDefn
uu) [ConstraintE]
cs (forall a. a -> Maybe a
Just Expr
rv)
where uu :: UnitDefn
uu = forall u. IsUnit u => u -> UnitDefn
unitWrapper u
un
cuc'' :: (IsUnit u) => String -> NP -> String -> (Stage -> Symbol) -> u
-> Space -> [ConstraintE] -> Expr -> ConstrConcept
cuc'' :: forall u.
IsUnit u =>
String
-> NP
-> String
-> (Stage -> Symbol)
-> u
-> Space
-> [ConstraintE]
-> Expr
-> ConstrConcept
cuc'' String
nam NP
trm String
desc Stage -> Symbol
sym u
un Space
space [ConstraintE]
cs Expr
rv =
DefinedQuantityDict -> [ConstraintE] -> Maybe Expr -> ConstrConcept
ConstrConcept (ConceptChunk
-> (Stage -> Symbol)
-> Space
-> Maybe UnitDefn
-> DefinedQuantityDict
dqd' (String -> NP -> String -> ConceptChunk
dcc String
nam NP
trm String
desc) Stage -> Symbol
sym Space
space (forall a. a -> Maybe a
Just UnitDefn
uu)) [ConstraintE]
cs (forall a. a -> Maybe a
Just Expr
rv)
where uu :: UnitDefn
uu = forall u. IsUnit u => u -> UnitDefn
unitWrapper u
un
cnstrw' :: (Quantity c, Concept c, Constrained c, HasReasVal c, MayHaveUnit c) => c -> ConstrConcept
cnstrw' :: forall c.
(Quantity c, Concept c, Constrained c, HasReasVal c,
MayHaveUnit c) =>
c -> ConstrConcept
cnstrw' c
c = DefinedQuantityDict -> [ConstraintE] -> Maybe Expr -> ConstrConcept
ConstrConcept (forall c.
(Quantity c, Concept c, MayHaveUnit c) =>
c -> DefinedQuantityDict
dqdWr c
c) (c
c forall s a. s -> Getting a s a -> a
^. forall c. Constrained c => Lens' c [ConstraintE]
constraints) (c
c forall s a. s -> Getting a s a -> a
^. forall c. HasReasVal c => Lens' c (Maybe Expr)
reasVal)