module Language.Drasil.NaturalLanguage.English.NounPhrase (
NounPhrase(..), NP,
atStartNP, atStartNP', titleizeNP, titleizeNP',
cn, cn', cn'', cn''', cnICES, cnIES, cnIP, cnIS, cnIrr, cnUM,
pn, pn', pn'', pn''', pnIrr,
nounPhrase, nounPhrase', nounPhrase'', nounPhraseSP, nounPhraseSent,
compoundPhrase,
compoundPhrase', compoundPhrase'', compoundPhrase''', compoundPhraseP1,
surroundNPStruct,
CapitalizationRuleG(..), CapitalizationRule, PluralRule(..), NPStruct,
npS, npP, (.-.), (.+.)
) where
import Data.Char (isLatin1, isLetter, toLower, toUpper)
import Language.Drasil.NaturalLanguage.English.NounPhrase.Core
class NounPhrase n where
phraseNP :: n -> NPStruct
pluralNP :: n -> PluralForm
sentenceCase :: n -> (NP -> NPStruct) -> Capitalization
titleCase :: n -> (NP -> NPStruct) -> Capitalization
type Capitalization = NPStruct
type PluralString = String
instance NounPhrase NP where
phraseNP :: NP -> PluralForm
phraseNP (ProperNoun String
n PluralRule
_) = String -> PluralForm
forall a. String -> NPStructG a
SC String
n
phraseNP (CommonNoun String
n PluralRule
_ CapitalizationRuleG Symbol
_) = String -> PluralForm
forall a. String -> NPStructG a
SC String
n
phraseNP (Phrase PluralForm
n PluralForm
_ CapitalizationRuleG Symbol
_ CapitalizationRuleG Symbol
_) = PluralForm
n
pluralNP :: NP -> PluralForm
pluralNP n :: NP
n@(ProperNoun String
_ PluralRule
p) = PluralForm -> PluralRule -> PluralForm
sPlur (NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
phraseNP NP
n) PluralRule
p
pluralNP n :: NP
n@(CommonNoun String
_ PluralRule
p CapitalizationRuleG Symbol
_) = PluralForm -> PluralRule -> PluralForm
sPlur (NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
phraseNP NP
n) PluralRule
p
pluralNP (Phrase PluralForm
_ PluralForm
p CapitalizationRuleG Symbol
_ CapitalizationRuleG Symbol
_) = PluralForm
p
sentenceCase :: NP -> (NP -> PluralForm) -> PluralForm
sentenceCase (ProperNoun String
n PluralRule
_) NP -> PluralForm
_ = String -> PluralForm
forall a. String -> NPStructG a
SC String
n
sentenceCase n :: NP
n@(CommonNoun String
_ PluralRule
_ CapitalizationRuleG Symbol
r) NP -> PluralForm
f = PluralForm -> CapitalizationRuleG Symbol -> PluralForm
cap (NP -> PluralForm
f NP
n) CapitalizationRuleG Symbol
r
sentenceCase n :: NP
n@(Phrase PluralForm
_ PluralForm
_ CapitalizationRuleG Symbol
r CapitalizationRuleG Symbol
_) NP -> PluralForm
f = PluralForm -> CapitalizationRuleG Symbol -> PluralForm
cap (NP -> PluralForm
f NP
n) CapitalizationRuleG Symbol
r
titleCase :: NP -> (NP -> PluralForm) -> PluralForm
titleCase n :: NP
n@ProperNoun {} NP -> PluralForm
_ = NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
phraseNP NP
n
titleCase n :: NP
n@CommonNoun {} NP -> PluralForm
f = PluralForm -> CapitalizationRuleG Symbol -> PluralForm
cap (NP -> PluralForm
f NP
n) CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapWords
titleCase n :: NP
n@(Phrase PluralForm
_ PluralForm
_ CapitalizationRuleG Symbol
_ CapitalizationRuleG Symbol
r) NP -> PluralForm
f = PluralForm -> CapitalizationRuleG Symbol -> PluralForm
cap (NP -> PluralForm
f NP
n) CapitalizationRuleG Symbol
r
pn, pn', pn'', pn''' :: String -> NP
pn :: String -> NP
pn String
n = String -> PluralRule -> NP
forall a. String -> PluralRule -> NPG a
ProperNoun String
n PluralRule
SelfPlur
pn' :: String -> NP
pn' String
n = String -> PluralRule -> NP
forall a. String -> PluralRule -> NPG a
ProperNoun String
n PluralRule
AddS
pn'' :: String -> NP
pn'' String
n = String -> PluralRule -> NP
forall a. String -> PluralRule -> NPG a
ProperNoun String
n PluralRule
AddE
pn''' :: String -> NP
pn''' String
n = String -> PluralRule -> NP
forall a. String -> PluralRule -> NPG a
ProperNoun String
n PluralRule
AddES
pnIrr :: String -> PluralRule -> NP
pnIrr :: String -> PluralRule -> NP
pnIrr = String -> PluralRule -> NP
forall a. String -> PluralRule -> NPG a
ProperNoun
cn, cn', cn'', cn''' :: String -> NP
cn :: String -> NP
cn String
n = String -> PluralRule -> CapitalizationRuleG Symbol -> NP
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun String
n PluralRule
SelfPlur CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst
cn' :: String -> NP
cn' String
n = String -> PluralRule -> CapitalizationRuleG Symbol -> NP
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun String
n PluralRule
AddS CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst
cn'' :: String -> NP
cn'' String
n = String -> PluralRule -> CapitalizationRuleG Symbol -> NP
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun String
n PluralRule
AddE CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst
cn''' :: String -> NP
cn''' String
n = String -> PluralRule -> CapitalizationRuleG Symbol -> NP
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun String
n PluralRule
AddES CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst
cnIES :: String -> NP
cnIES :: String -> NP
cnIES String
n = String -> PluralRule -> CapitalizationRuleG Symbol -> NP
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun String
n ((String -> String) -> PluralRule
IrregPlur (\String
x -> String -> String
forall a. HasCallStack => [a] -> [a]
init String
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"ies")) CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst
cnICES :: String -> NP
cnICES :: String -> NP
cnICES String
n = String -> PluralRule -> CapitalizationRuleG Symbol -> NP
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun String
n ((String -> String) -> PluralRule
IrregPlur (\String
x -> String -> String
forall a. HasCallStack => [a] -> [a]
init (String -> String
forall a. HasCallStack => [a] -> [a]
init String
x) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"ices")) CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst
cnIS :: String -> NP
cnIS :: String -> NP
cnIS String
n = String -> PluralRule -> CapitalizationRuleG Symbol -> NP
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun String
n ((String -> String) -> PluralRule
IrregPlur (\String
x -> String -> String
forall a. HasCallStack => [a] -> [a]
init (String -> String
forall a. HasCallStack => [a] -> [a]
init String
x) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"es")) CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst
cnUM :: String -> NP
cnUM :: String -> NP
cnUM String
n = String -> PluralRule -> CapitalizationRuleG Symbol -> NP
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun String
n ((String -> String) -> PluralRule
IrregPlur (\String
x -> String -> String
forall a. HasCallStack => [a] -> [a]
init (String -> String
forall a. HasCallStack => [a] -> [a]
init String
x) String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"a")) CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst
cnIP :: String -> PluralRule -> NP
cnIP :: String -> PluralRule -> NP
cnIP String
n PluralRule
p = String -> PluralRule -> CapitalizationRuleG Symbol -> NP
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun String
n PluralRule
p CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst
cnIrr :: String -> PluralRule -> CapitalizationRule -> NP
cnIrr :: String -> PluralRule -> CapitalizationRuleG Symbol -> NP
cnIrr = String -> PluralRule -> CapitalizationRuleG Symbol -> NP
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun
nounPhrase :: String -> PluralString -> NP
nounPhrase :: String -> String -> NP
nounPhrase String
s String
p = PluralForm
-> PluralForm
-> CapitalizationRuleG Symbol
-> CapitalizationRuleG Symbol
-> NP
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase (String -> PluralForm
forall a. String -> NPStructG a
SC String
s) (String -> PluralForm
forall a. String -> NPStructG a
SC String
p) CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapWords
nounPhrase' :: String -> PluralString -> CapitalizationRule -> NP
nounPhrase' :: String -> String -> CapitalizationRuleG Symbol -> NP
nounPhrase' String
s String
p CapitalizationRuleG Symbol
c = PluralForm
-> PluralForm
-> CapitalizationRuleG Symbol
-> CapitalizationRuleG Symbol
-> NP
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase (String -> PluralForm
forall a. String -> NPStructG a
SC String
s) (String -> PluralForm
forall a. String -> NPStructG a
SC String
p) CapitalizationRuleG Symbol
c CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapWords
nounPhrase'' :: NPStruct -> PluralForm -> CapitalizationRule -> CapitalizationRule -> NP
nounPhrase'' :: PluralForm
-> PluralForm
-> CapitalizationRuleG Symbol
-> CapitalizationRuleG Symbol
-> NP
nounPhrase'' = PluralForm
-> PluralForm
-> CapitalizationRuleG Symbol
-> CapitalizationRuleG Symbol
-> NP
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase
nounPhraseSP :: String -> NP
nounPhraseSP :: String -> NP
nounPhraseSP String
s = PluralForm
-> PluralForm
-> CapitalizationRuleG Symbol
-> CapitalizationRuleG Symbol
-> NP
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase (String -> PluralForm
forall a. String -> NPStructG a
SC String
s) (String -> PluralForm
forall a. String -> NPStructG a
SC String
s) CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapWords
nounPhraseSent :: NPStruct -> NP
nounPhraseSent :: PluralForm -> NP
nounPhraseSent PluralForm
s = PluralForm
-> PluralForm
-> CapitalizationRuleG Symbol
-> CapitalizationRuleG Symbol
-> NP
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase PluralForm
s (PluralForm -> PluralRule -> PluralForm
sPlur PluralForm
s PluralRule
AddS) CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapWords
compoundPhrase :: (NounPhrase a, NounPhrase b) => a -> b -> NP
compoundPhrase :: forall a b. (NounPhrase a, NounPhrase b) => a -> b -> NP
compoundPhrase a
t1 b
t2 = PluralForm
-> PluralForm
-> CapitalizationRuleG Symbol
-> CapitalizationRuleG Symbol
-> NP
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase
(a -> PluralForm
forall n. NounPhrase n => n -> PluralForm
phraseNP a
t1 PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: b -> PluralForm
forall n. NounPhrase n => n -> PluralForm
phraseNP b
t2) (a -> PluralForm
forall n. NounPhrase n => n -> PluralForm
phraseNP a
t1 PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: b -> PluralForm
forall n. NounPhrase n => n -> PluralForm
pluralNP b
t2) CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapWords
compoundPhrase' :: NP -> NP -> NP
compoundPhrase' :: NP -> NP -> NP
compoundPhrase' NP
t1 NP
t2 = PluralForm
-> PluralForm
-> CapitalizationRuleG Symbol
-> CapitalizationRuleG Symbol
-> NP
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase
(NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
phraseNP NP
t1 PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
phraseNP NP
t2) (NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
phraseNP NP
t1 PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
pluralNP NP
t2) CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapWords CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapWords
compoundPhrase'' :: (NP -> NPStruct) -> (NP -> NPStruct) -> NP -> NP -> NP
compoundPhrase'' :: (NP -> PluralForm) -> (NP -> PluralForm) -> NP -> NP -> NP
compoundPhrase'' NP -> PluralForm
f1 NP -> PluralForm
f2 NP
t1 NP
t2 = PluralForm
-> PluralForm
-> CapitalizationRuleG Symbol
-> CapitalizationRuleG Symbol
-> NP
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase
(NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
phraseNP NP
t1 PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
phraseNP NP
t2) (NP -> PluralForm
f1 NP
t1 PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NP -> PluralForm
f2 NP
t2) CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapWords CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapWords
compoundPhrase''' :: (NP -> NPStruct) -> NP -> NP -> NP
compoundPhrase''' :: (NP -> PluralForm) -> NP -> NP -> NP
compoundPhrase''' NP -> PluralForm
f1 NP
t1 NP
t2 = PluralForm
-> PluralForm
-> CapitalizationRuleG Symbol
-> CapitalizationRuleG Symbol
-> NP
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase
(NP -> PluralForm
f1 NP
t1 PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
phraseNP NP
t2) (NP -> PluralForm
f1 NP
t1 PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
pluralNP NP
t2) CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapWords
compoundPhraseP1 :: NP -> NP -> NP
compoundPhraseP1 :: NP -> NP -> NP
compoundPhraseP1 = (NP -> PluralForm) -> NP -> NP -> NP
compoundPhrase''' NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
pluralNP
atStartNP, atStartNP' :: NounPhrase n => n -> Capitalization
atStartNP :: forall n. NounPhrase n => n -> PluralForm
atStartNP n
n = n -> (NP -> PluralForm) -> PluralForm
forall n. NounPhrase n => n -> (NP -> PluralForm) -> PluralForm
sentenceCase n
n NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
phraseNP
atStartNP' :: forall n. NounPhrase n => n -> PluralForm
atStartNP' n
n = n -> (NP -> PluralForm) -> PluralForm
forall n. NounPhrase n => n -> (NP -> PluralForm) -> PluralForm
sentenceCase n
n NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
pluralNP
titleizeNP, titleizeNP' :: NounPhrase n => n -> Capitalization
titleizeNP :: forall n. NounPhrase n => n -> PluralForm
titleizeNP n
n = n -> (NP -> PluralForm) -> PluralForm
forall n. NounPhrase n => n -> (NP -> PluralForm) -> PluralForm
titleCase n
n NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
phraseNP
titleizeNP' :: forall n. NounPhrase n => n -> PluralForm
titleizeNP' n
n = n -> (NP -> PluralForm) -> PluralForm
forall n. NounPhrase n => n -> (NP -> PluralForm) -> PluralForm
titleCase n
n NP -> PluralForm
forall n. NounPhrase n => n -> PluralForm
pluralNP
sPlur :: NPStruct -> PluralRule -> NPStruct
sPlur :: PluralForm -> PluralRule -> PluralForm
sPlur (SC String
s) PluralRule
AddS = String -> PluralForm
forall a. String -> NPStructG a
SC (String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"s")
sPlur (SC String
s) PluralRule
AddE = String -> PluralForm
forall a. String -> NPStructG a
SC (String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"e")
sPlur s :: PluralForm
s@(SC String
_) PluralRule
AddES = PluralForm -> PluralRule -> PluralForm
sPlur (PluralForm -> PluralRule -> PluralForm
sPlur PluralForm
s PluralRule
AddE) PluralRule
AddS
sPlur s :: PluralForm
s@(SC String
_) PluralRule
SelfPlur = PluralForm
s
sPlur (SC String
sts) (IrregPlur String -> String
f) = String -> PluralForm
forall a. String -> NPStructG a
SC (String -> PluralForm) -> String -> PluralForm
forall a b. (a -> b) -> a -> b
$ String -> String
f String
sts
sPlur (PluralForm
a :+!: PluralForm
b) PluralRule
pt = PluralForm
a PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: PluralForm -> PluralRule -> PluralForm
sPlur PluralForm
b PluralRule
pt
sPlur (PluralForm
a :-!: PluralForm
b) PluralRule
pt = PluralForm
a PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: PluralForm -> PluralRule -> PluralForm
sPlur PluralForm
b PluralRule
pt
sPlur PluralForm
a PluralRule
_ = String -> PluralForm
forall a. String -> NPStructG a
SC String
"MISSING PLURAL FOR:" PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: PluralForm
a
cap :: NPStruct -> CapitalizationRule -> NPStruct
cap :: PluralForm -> CapitalizationRuleG Symbol -> PluralForm
cap PluralForm
_ (Replace PluralForm
s) = PluralForm
s
cap PluralForm
s CapitalizationRuleG Symbol
CapNothing = PluralForm
s
cap (SC []) CapitalizationRuleG Symbol
CapFirst = String -> PluralForm
forall a. String -> NPStructG a
SC []
cap (SC (Char
s:String
ss)) CapitalizationRuleG Symbol
CapFirst = String -> PluralForm
forall a. String -> NPStructG a
SC (Char -> Char
toUpper Char
s Char -> String -> String
forall a. a -> [a] -> [a]
: String
ss)
cap (SC String
s) CapitalizationRuleG Symbol
CapWords = String -> (String -> String) -> (String -> String) -> PluralForm
capString String
s String -> String
capFirstWord String -> String
capWords
cap (PC Symbol
symb :+!: PluralForm
x) CapitalizationRuleG Symbol
CapFirst = Symbol -> PluralForm
forall a. a -> NPStructG a
PC Symbol
symb PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: PluralForm
x
cap (PC Symbol
symb :+!: PluralForm
x) CapitalizationRuleG Symbol
CapWords = Symbol -> PluralForm
forall a. a -> NPStructG a
PC Symbol
symb PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: PluralForm
x
cap (PluralForm
s1 :+!: PluralForm
s2) CapitalizationRuleG Symbol
CapWords = PluralForm -> CapitalizationRuleG Symbol -> PluralForm
cap PluralForm
s1 CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapWords PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: PluralForm -> PluralForm
capTail PluralForm
s2
cap (PluralForm
s1 :+!: PluralForm
s2) CapitalizationRuleG Symbol
CapFirst = PluralForm -> CapitalizationRuleG Symbol -> PluralForm
cap PluralForm
s1 CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: PluralForm
s2
cap (PC Symbol
symb :-!: PluralForm
x) CapitalizationRuleG Symbol
CapFirst = Symbol -> PluralForm
forall a. a -> NPStructG a
PC Symbol
symb PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: PluralForm
x
cap (PC Symbol
symb :-!: PluralForm
x) CapitalizationRuleG Symbol
CapWords = Symbol -> PluralForm
forall a. a -> NPStructG a
PC Symbol
symb PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: PluralForm
x
cap (PluralForm
s1 :-!: PluralForm
s2) CapitalizationRuleG Symbol
CapWords = PluralForm -> CapitalizationRuleG Symbol -> PluralForm
cap PluralForm
s1 CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapWords PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: PluralForm -> PluralForm
capTail PluralForm
s2
cap (PluralForm
s1 :-!: PluralForm
s2) CapitalizationRuleG Symbol
CapFirst = PluralForm -> CapitalizationRuleG Symbol -> PluralForm
cap PluralForm
s1 CapitalizationRuleG Symbol
forall a. CapitalizationRuleG a
CapFirst PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: PluralForm
s2
cap (PC Symbol
p) CapitalizationRuleG Symbol
_ = Symbol -> PluralForm
forall a. a -> NPStructG a
PC Symbol
p
capTail :: NPStruct -> NPStruct
capTail :: PluralForm -> PluralForm
capTail (SC String
s) = String -> (String -> String) -> (String -> String) -> PluralForm
capString String
s String -> String
capWords String -> String
capWords
capTail (PC Symbol
symb :+!: PluralForm
b) = Symbol -> PluralForm
forall a. a -> NPStructG a
PC Symbol
symb PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: PluralForm
b
capTail (PluralForm
a :+!: PluralForm
b) = PluralForm -> PluralForm
capTail PluralForm
a PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: PluralForm -> PluralForm
capTail PluralForm
b
capTail (PC Symbol
symb :-!: PluralForm
b) = Symbol -> PluralForm
forall a. a -> NPStructG a
PC Symbol
symb PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: PluralForm
b
capTail (PluralForm
a :-!: PluralForm
b) = PluralForm -> PluralForm
capTail PluralForm
a PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: PluralForm -> PluralForm
capTail PluralForm
b
capTail (PC Symbol
p) = Symbol -> PluralForm
forall a. a -> NPStructG a
PC Symbol
p
capString :: String -> (String -> String) -> (String -> String) -> NPStruct
capString :: String -> (String -> String) -> (String -> String) -> PluralForm
capString String
s String -> String
f String -> String
g = String -> PluralForm
forall a. String -> NPStructG a
SC (String -> PluralForm)
-> ([String] -> String) -> [String] -> PluralForm
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> String) -> String -> String
findHyph String -> String
g (String -> String) -> ([String] -> String) -> [String] -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [String] -> String
unwords ([String] -> PluralForm) -> [String] -> PluralForm
forall a b. (a -> b) -> a -> b
$ [String] -> [String]
process (String -> [String]
words String
s)
where
process :: [String] -> [String]
process (String
x:[String]
xs) = String -> String
f String
x String -> [String] -> [String]
forall a. a -> [a] -> [a]
: (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map String -> String
g [String]
xs
process [] = []
findHyph :: (String -> String) -> String -> String
findHyph :: (String -> String) -> String -> String
findHyph String -> String
_ String
"" = String
""
findHyph String -> String
_ [Char
x] = [Char
x]
findHyph String -> String
f (Char
x:String
xs)
| Char
x Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'-' = Char
'-' Char -> String -> String
forall a. a -> [a] -> [a]
: (String -> String) -> String -> String
findHyph String -> String
f (String -> String
f String
xs)
| Bool
otherwise = Char
x Char -> String -> String
forall a. a -> [a] -> [a]
: (String -> String) -> String -> String
findHyph String -> String
f String
xs
capFirstWord :: String -> String
capFirstWord :: String -> String
capFirstWord String
"" = String
""
capFirstWord w :: String
w@(Char
c:String
cs)
| Bool -> Bool
not (Char -> Bool
isLetter Char
c) = String
w
| Bool -> Bool
not (Char -> Bool
isLatin1 Char
c) = String
w
| Bool
otherwise = Char -> Char
toUpper Char
c Char -> String -> String
forall a. a -> [a] -> [a]
: String
cs
capWords :: String -> String
capWords :: String -> String
capWords String
"" = String
""
capWords w :: String
w@(Char
c:String
cs)
| Bool -> Bool
not (Char -> Bool
isLetter Char
c) = String
w
| Bool -> Bool
not (Char -> Bool
isLatin1 Char
c) = String
w
| String
w String -> [String] -> Bool
forall a. Eq a => a -> [a] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String]
doNotCaps = Char -> Char
toLower Char
c Char -> String -> String
forall a. a -> [a] -> [a]
: String
cs
| Bool
otherwise = Char -> Char
toUpper Char
c Char -> String -> String
forall a. a -> [a] -> [a]
: String
cs
doNotCaps :: [String]
doNotCaps :: [String]
doNotCaps = [String
"a", String
"an", String
"the", String
"at", String
"by", String
"for", String
"in", String
"of",
String
"on", String
"to", String
"up", String
"and", String
"as", String
"but", String
"or", String
"nor"]
surroundNPStruct :: String -> String -> NPStruct -> NPStruct
surroundNPStruct :: String -> String -> PluralForm -> PluralForm
surroundNPStruct String
l String
r (SC String
s) = String -> PluralForm
forall a. String -> NPStructG a
SC (String -> PluralForm) -> String -> PluralForm
forall a b. (a -> b) -> a -> b
$ String
l String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
r
surroundNPStruct String
l String
r (PluralForm
s1 :+!: PluralForm
s2) = String -> String -> PluralForm -> PluralForm
surroundNPStruct String
l String
"" PluralForm
s1 PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: String -> String -> PluralForm -> PluralForm
surroundNPStruct String
"" String
r PluralForm
s2
surroundNPStruct String
l String
r (PluralForm
s1 :-!: PluralForm
s2) = String -> String -> PluralForm -> PluralForm
surroundNPStruct String
l String
"" PluralForm
s1 PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: String -> String -> PluralForm -> PluralForm
surroundNPStruct String
"" String
r PluralForm
s2
surroundNPStruct String
l String
r (PC Symbol
p) = String -> PluralForm
forall a. String -> NPStructG a
SC String
l PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: Symbol -> PluralForm
forall a. a -> NPStructG a
PC Symbol
p PluralForm -> PluralForm -> PluralForm
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: String -> PluralForm
forall a. String -> NPStructG a
SC String
r