{-# LANGUAGE GADTs, PostfixOperators #-}
{-# OPTIONS_GHC -Wno-redundant-constraints #-}
module Language.Drasil.Sentence (
Sentence(..),
SentenceStyle(..), RefInfo(..), TermCapitalization(..),
(+:+), (+:+.), (+:), (!.), capSent, headSent, ch, eS, eS', sC, sDash, sParen,
sentencePlural, sentenceShort,
sentenceTerm,
sdep, lnames, lnames'
) where
import Data.Char (toUpper)
import Drasil.Database (HasChunkRefs(..), UID, IsChunk, UIDRef, hide, raw)
import Language.Drasil.Chunk.NamedIdea (Idea)
import Language.Drasil.ExprClasses (Express(express))
import Language.Drasil.ModelExpr.Lang (ModelExpr)
import Language.Drasil.ModelExpr.Extract (meDep)
import Language.Drasil.NaturalLanguage.English.NounPhrase.Core (NP)
import Language.Drasil.UnitLang (USymb)
import Language.Drasil.Space (HasSpace)
import Language.Drasil.Symbol (HasSymbol, Symbol)
import qualified Data.Set as Set
data SentenceStyle = PluralTerm
| TermStyle
| ShortStyle
data TermCapitalization = CapF | CapW | NoCap
data RefInfo = None
| Equation [Int]
| Page [Int]
| RefNote String
infixr 5 :+:
data Sentence where
Ch :: SentenceStyle -> TermCapitalization -> UID -> Sentence
SyCh :: (IsChunk t, Idea t, HasSpace t, HasSymbol t) => UIDRef t -> Sentence
Sy :: USymb -> Sentence
NP :: NP -> Sentence
S :: String -> Sentence
P :: Symbol -> Sentence
E :: ModelExpr -> Sentence
Ref :: UID -> Sentence -> RefInfo -> Sentence
Quote :: Sentence -> Sentence
Percent :: Sentence
(:+:) :: Sentence -> Sentence -> Sentence
EmptyS :: Sentence
eS :: ModelExpr -> Sentence
eS :: ModelExpr -> Sentence
eS = ModelExpr -> Sentence
E
eS' :: Express t => t -> Sentence
eS' :: forall t. Express t => t -> Sentence
eS' = ModelExpr -> Sentence
E (ModelExpr -> Sentence) -> (t -> ModelExpr) -> t -> Sentence
forall b c a. (b -> c) -> (a -> b) -> a -> c
. t -> ModelExpr
forall c. Express c => c -> ModelExpr
express
ch :: (IsChunk t, Idea t, HasSpace t, HasSymbol t) => t -> Sentence
ch :: forall t.
(IsChunk t, Idea t, HasSpace t, HasSymbol t) =>
t -> Sentence
ch t
s = UIDRef t -> Sentence
forall t.
(IsChunk t, Idea t, HasSpace t, HasSymbol t) =>
UIDRef t -> Sentence
SyCh (UIDRef t -> Sentence) -> UIDRef t -> Sentence
forall a b. (a -> b) -> a -> b
$ t -> UIDRef t
forall t. IsChunk t => t -> UIDRef t
hide t
s
instance Semigroup Sentence where
<> :: Sentence -> Sentence -> Sentence
(<>) = Sentence -> Sentence -> Sentence
(:+:)
instance Monoid Sentence where
mempty :: Sentence
mempty = Sentence
EmptyS
sentencePlural, sentenceShort, sentenceTerm :: UID -> Sentence
sentencePlural :: UID -> Sentence
sentencePlural = SentenceStyle -> TermCapitalization -> UID -> Sentence
Ch SentenceStyle
PluralTerm TermCapitalization
NoCap
sentenceShort :: UID -> Sentence
sentenceShort = SentenceStyle -> TermCapitalization -> UID -> Sentence
Ch SentenceStyle
ShortStyle TermCapitalization
NoCap
sentenceTerm :: UID -> Sentence
sentenceTerm = SentenceStyle -> TermCapitalization -> UID -> Sentence
Ch SentenceStyle
TermStyle TermCapitalization
NoCap
sParen :: Sentence -> Sentence
sParen :: Sentence -> Sentence
sParen Sentence
x = String -> Sentence
S String
"(" Sentence -> Sentence -> Sentence
:+: Sentence
x Sentence -> Sentence -> Sentence
:+: String -> Sentence
S String
")"
sDash :: Sentence -> Sentence -> Sentence
sDash :: Sentence -> Sentence -> Sentence
sDash Sentence
a Sentence
b = Sentence
a Sentence -> Sentence -> Sentence
+:+ String -> Sentence
S String
"-" Sentence -> Sentence -> Sentence
+:+ Sentence
b
(+:+) :: Sentence -> Sentence -> Sentence
Sentence
EmptyS +:+ :: Sentence -> Sentence -> Sentence
+:+ Sentence
b = Sentence
b
Sentence
a +:+ Sentence
EmptyS = Sentence
a
Sentence
a +:+ Sentence
b = Sentence
a Sentence -> Sentence -> Sentence
:+: String -> Sentence
S String
" " Sentence -> Sentence -> Sentence
:+: Sentence
b
sC :: Sentence -> Sentence -> Sentence
Sentence
a sC :: Sentence -> Sentence -> Sentence
`sC` Sentence
b = Sentence
a Sentence -> Sentence -> Sentence
:+: String -> Sentence
S String
"," Sentence -> Sentence -> Sentence
+:+ Sentence
b
(+:+.) :: Sentence -> Sentence -> Sentence
Sentence
a +:+. :: Sentence -> Sentence -> Sentence
+:+. Sentence
b = Sentence
a Sentence -> Sentence -> Sentence
+:+ Sentence
b Sentence -> Sentence -> Sentence
:+: String -> Sentence
S String
"."
(!.) :: Sentence -> Sentence
!. :: Sentence -> Sentence
(!.) Sentence
a = Sentence
a Sentence -> Sentence -> Sentence
:+: String -> Sentence
S String
"."
(+:) :: Sentence -> Sentence -> Sentence
Sentence
a +: :: Sentence -> Sentence -> Sentence
+: Sentence
b = Sentence
a Sentence -> Sentence -> Sentence
+:+ Sentence
b Sentence -> Sentence -> Sentence
:+: String -> Sentence
S String
":"
capSent :: Sentence -> Sentence
capSent :: Sentence -> Sentence
capSent (S (Char
s:String
ss)) = String -> Sentence
S (Char -> Char
toUpper Char
s Char -> String -> String
forall a. a -> [a] -> [a]
: String
ss)
capSent (Sentence
a :+: Sentence
b) = Sentence -> Sentence
capSent Sentence
a Sentence -> Sentence -> Sentence
:+: Sentence
b
capSent Sentence
x = Sentence
x
headSent :: Int -> Sentence -> Sentence
headSent :: Int -> Sentence -> Sentence
headSent Int
s Sentence
x = String -> Sentence
S ([String] -> String
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat (Int -> String -> [String]
forall a. Int -> a -> [a]
replicate Int
s String
"#")) Sentence -> Sentence -> Sentence
:+: String -> Sentence
S String
" " Sentence -> Sentence -> Sentence
:+: Sentence
x
getUIDs :: Sentence -> [UID]
getUIDs :: Sentence -> [UID]
getUIDs (Ch SentenceStyle
ShortStyle TermCapitalization
_ UID
_) = []
getUIDs (Ch SentenceStyle
TermStyle TermCapitalization
_ UID
_) = []
getUIDs (Ch SentenceStyle
PluralTerm TermCapitalization
_ UID
_) = []
getUIDs (SyCh UIDRef t
a) = [UIDRef t -> UID
forall t. UIDRef t -> UID
raw UIDRef t
a]
getUIDs Sy {} = []
getUIDs NP {} = []
getUIDs S {} = []
getUIDs P {} = []
getUIDs Ref {} = []
getUIDs Sentence
Percent = []
getUIDs ((:+:) Sentence
a Sentence
b) = Sentence -> [UID]
getUIDs Sentence
a [UID] -> [UID] -> [UID]
forall a. [a] -> [a] -> [a]
++ Sentence -> [UID]
getUIDs Sentence
b
getUIDs (Quote Sentence
a) = Sentence -> [UID]
getUIDs Sentence
a
getUIDs (E ModelExpr
a) = ModelExpr -> [UID]
meDep ModelExpr
a
getUIDs Sentence
EmptyS = []
sdep :: Sentence -> Set.Set UID
sdep :: Sentence -> Set UID
sdep = [UID] -> Set UID
forall a. Ord a => [a] -> Set a
Set.fromList ([UID] -> Set UID) -> (Sentence -> [UID]) -> Sentence -> Set UID
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sentence -> [UID]
getUIDs
{-# INLINE sdep #-}
lnames :: Sentence -> Set.Set UID
lnames :: Sentence -> Set UID
lnames Ch {} = Set UID
forall a. Set a
Set.empty
lnames SyCh {} = Set UID
forall a. Set a
Set.empty
lnames Sy {} = Set UID
forall a. Set a
Set.empty
lnames NP {} = Set UID
forall a. Set a
Set.empty
lnames S {} = Set UID
forall a. Set a
Set.empty
lnames Sentence
Percent = Set UID
forall a. Set a
Set.empty
lnames P {} = Set UID
forall a. Set a
Set.empty
lnames (Ref UID
a Sentence
_ RefInfo
_) = UID -> Set UID
forall a. a -> Set a
Set.singleton UID
a
lnames ((:+:) Sentence
a Sentence
b) = Sentence -> Set UID
lnames Sentence
a Set UID -> Set UID -> Set UID
forall a. Ord a => Set a -> Set a -> Set a
`Set.union` Sentence -> Set UID
lnames Sentence
b
lnames Quote {} = Set UID
forall a. Set a
Set.empty
lnames E {} = Set UID
forall a. Set a
Set.empty
lnames Sentence
EmptyS = Set UID
forall a. Set a
Set.empty
{-# INLINE lnames #-}
lnames' :: [Sentence] -> [UID]
lnames' :: [Sentence] -> [UID]
lnames' = (Sentence -> [UID]) -> [Sentence] -> [UID]
forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (Set UID -> [UID]
forall a. Set a -> [a]
Set.toList (Set UID -> [UID]) -> (Sentence -> Set UID) -> Sentence -> [UID]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Sentence -> Set UID
lnames)
{-# INLINE lnames' #-}
instance HasChunkRefs Sentence where
chunkRefs :: Sentence -> Set UID
chunkRefs Sentence
s = [Set UID] -> Set UID
forall (f :: * -> *) a. (Foldable f, Ord a) => f (Set a) -> Set a
Set.unions [Sentence -> Set UID
lnames Sentence
s, Sentence -> Set UID
sdep Sentence
s]
{-# INLINABLE chunkRefs #-}