{-# LANGUAGE FunctionalDependencies #-}
module Drasil.NaturalLanguage.English.NounPhrase (
NounPhrase(..),
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(..), PluralRule(..), NPG, NPStructG, PluralFormG,
npS, npP, (.-.), (.+.)
) where
import Data.Char (isLatin1, isLetter, toLower, toUpper)
import Drasil.NaturalLanguage.English.NounPhrase.Core
class NounPhrase n a | n -> a where
phraseNP :: n -> NPStructG a
pluralNP :: n -> PluralFormG a
sentenceCase :: n -> (n -> NPStructG a) -> Capitalization a
titleCase :: n -> (n -> NPStructG a) -> Capitalization a
type Capitalization a = NPStructG a
type PluralString = String
instance NounPhrase (NPG a) a where
phraseNP :: NPG a -> PluralFormG a
phraseNP (ProperNoun String
n PluralRule
_) = String -> PluralFormG a
forall a. String -> NPStructG a
SC String
n
phraseNP (CommonNoun String
n PluralRule
_ CapitalizationRuleG a
_) = String -> PluralFormG a
forall a. String -> NPStructG a
SC String
n
phraseNP (Phrase PluralFormG a
n PluralFormG a
_ CapitalizationRuleG a
_ CapitalizationRuleG a
_) = PluralFormG a
n
pluralNP :: NPG a -> PluralFormG a
pluralNP n :: NPG a
n@(ProperNoun String
_ PluralRule
p) = PluralFormG a -> PluralRule -> PluralFormG a
forall a. NPStructG a -> PluralRule -> NPStructG a
sPlur (NPG a -> PluralFormG a
forall n a. NounPhrase n a => n -> NPStructG a
phraseNP NPG a
n) PluralRule
p
pluralNP n :: NPG a
n@(CommonNoun String
_ PluralRule
p CapitalizationRuleG a
_) = PluralFormG a -> PluralRule -> PluralFormG a
forall a. NPStructG a -> PluralRule -> NPStructG a
sPlur (NPG a -> PluralFormG a
forall n a. NounPhrase n a => n -> NPStructG a
phraseNP NPG a
n) PluralRule
p
pluralNP (Phrase PluralFormG a
_ PluralFormG a
p CapitalizationRuleG a
_ CapitalizationRuleG a
_) = PluralFormG a
p
sentenceCase :: NPG a -> (NPG a -> PluralFormG a) -> PluralFormG a
sentenceCase (ProperNoun String
n PluralRule
_) NPG a -> PluralFormG a
_ = String -> PluralFormG a
forall a. String -> NPStructG a
SC String
n
sentenceCase n :: NPG a
n@(CommonNoun String
_ PluralRule
_ CapitalizationRuleG a
r) NPG a -> PluralFormG a
f = PluralFormG a -> CapitalizationRuleG a -> PluralFormG a
forall a. NPStructG a -> CapitalizationRuleG a -> NPStructG a
cap (NPG a -> PluralFormG a
f NPG a
n) CapitalizationRuleG a
r
sentenceCase n :: NPG a
n@(Phrase PluralFormG a
_ PluralFormG a
_ CapitalizationRuleG a
r CapitalizationRuleG a
_) NPG a -> PluralFormG a
f = PluralFormG a -> CapitalizationRuleG a -> PluralFormG a
forall a. NPStructG a -> CapitalizationRuleG a -> NPStructG a
cap (NPG a -> PluralFormG a
f NPG a
n) CapitalizationRuleG a
r
titleCase :: NPG a -> (NPG a -> PluralFormG a) -> PluralFormG a
titleCase n :: NPG a
n@ProperNoun {} NPG a -> PluralFormG a
_ = NPG a -> PluralFormG a
forall n a. NounPhrase n a => n -> NPStructG a
phraseNP NPG a
n
titleCase n :: NPG a
n@CommonNoun {} NPG a -> PluralFormG a
f = PluralFormG a -> CapitalizationRuleG a -> PluralFormG a
forall a. NPStructG a -> CapitalizationRuleG a -> NPStructG a
cap (NPG a -> PluralFormG a
f NPG a
n) CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapWords
titleCase n :: NPG a
n@(Phrase PluralFormG a
_ PluralFormG a
_ CapitalizationRuleG a
_ CapitalizationRuleG a
r) NPG a -> PluralFormG a
f = PluralFormG a -> CapitalizationRuleG a -> PluralFormG a
forall a. NPStructG a -> CapitalizationRuleG a -> NPStructG a
cap (NPG a -> PluralFormG a
f NPG a
n) CapitalizationRuleG a
r
pn, pn', pn'', pn''' :: String -> NPG a
pn :: forall a. String -> NPG a
pn String
n = String -> PluralRule -> NPG a
forall a. String -> PluralRule -> NPG a
ProperNoun String
n PluralRule
SelfPlur
pn' :: forall a. String -> NPG a
pn' String
n = String -> PluralRule -> NPG a
forall a. String -> PluralRule -> NPG a
ProperNoun String
n PluralRule
AddS
pn'' :: forall a. String -> NPG a
pn'' String
n = String -> PluralRule -> NPG a
forall a. String -> PluralRule -> NPG a
ProperNoun String
n PluralRule
AddE
pn''' :: forall a. String -> NPG a
pn''' String
n = String -> PluralRule -> NPG a
forall a. String -> PluralRule -> NPG a
ProperNoun String
n PluralRule
AddES
pnIrr :: String -> PluralRule -> NPG a
pnIrr :: forall a. String -> PluralRule -> NPG a
pnIrr = String -> PluralRule -> NPG a
forall a. String -> PluralRule -> NPG a
ProperNoun
cn, cn', cn'', cn''' :: String -> NPG a
cn :: forall a. String -> NPG a
cn String
n = String -> PluralRule -> CapitalizationRuleG a -> NPG a
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun String
n PluralRule
SelfPlur CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst
cn' :: forall a. String -> NPG a
cn' String
n = String -> PluralRule -> CapitalizationRuleG a -> NPG a
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun String
n PluralRule
AddS CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst
cn'' :: forall a. String -> NPG a
cn'' String
n = String -> PluralRule -> CapitalizationRuleG a -> NPG a
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun String
n PluralRule
AddE CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst
cn''' :: forall a. String -> NPG a
cn''' String
n = String -> PluralRule -> CapitalizationRuleG a -> NPG a
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun String
n PluralRule
AddES CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst
cnIES :: String -> NPG a
cnIES :: forall a. String -> NPG a
cnIES String
n = String -> PluralRule -> CapitalizationRuleG a -> NPG a
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. Semigroup a => a -> a -> a
<> String
"ies")) CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst
cnICES :: String -> NPG a
cnICES :: forall a. String -> NPG a
cnICES String
n = String -> PluralRule -> CapitalizationRuleG a -> NPG a
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. Semigroup a => a -> a -> a
<> String
"ices")) CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst
cnIS :: String -> NPG a
cnIS :: forall a. String -> NPG a
cnIS String
n = String -> PluralRule -> CapitalizationRuleG a -> NPG a
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. Semigroup a => a -> a -> a
<> String
"es")) CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst
cnUM :: String -> NPG a
cnUM :: forall a. String -> NPG a
cnUM String
n = String -> PluralRule -> CapitalizationRuleG a -> NPG a
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. Semigroup a => a -> a -> a
<> String
"a")) CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst
cnIP :: String -> PluralRule -> NPG a
cnIP :: forall a. String -> PluralRule -> NPG a
cnIP String
n PluralRule
p = String -> PluralRule -> CapitalizationRuleG a -> NPG a
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun String
n PluralRule
p CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst
cnIrr :: String -> PluralRule -> CapitalizationRuleG a -> NPG a
cnIrr :: forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
cnIrr = String -> PluralRule -> CapitalizationRuleG a -> NPG a
forall a. String -> PluralRule -> CapitalizationRuleG a -> NPG a
CommonNoun
nounPhrase :: String -> PluralString -> NPG a
nounPhrase :: forall a. String -> String -> NPG a
nounPhrase String
s String
p = NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase (String -> NPStructG a
forall a. String -> NPStructG a
SC String
s) (String -> NPStructG a
forall a. String -> NPStructG a
SC String
p) CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapWords
nounPhrase' :: String -> PluralString -> CapitalizationRuleG a -> NPG a
nounPhrase' :: forall a. String -> String -> CapitalizationRuleG a -> NPG a
nounPhrase' String
s String
p CapitalizationRuleG a
c = NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase (String -> NPStructG a
forall a. String -> NPStructG a
SC String
s) (String -> NPStructG a
forall a. String -> NPStructG a
SC String
p) CapitalizationRuleG a
c CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapWords
nounPhrase'' :: NPStructG a -> PluralFormG a -> CapitalizationRuleG a -> CapitalizationRuleG a -> NPG a
nounPhrase'' :: forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
nounPhrase'' = NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase
nounPhraseSP :: String -> NPG a
nounPhraseSP :: forall a. String -> NPG a
nounPhraseSP String
s = NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase (String -> NPStructG a
forall a. String -> NPStructG a
SC String
s) (String -> NPStructG a
forall a. String -> NPStructG a
SC String
s) CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapWords
nounPhraseSent :: NPStructG a -> NPG a
nounPhraseSent :: forall a. NPStructG a -> NPG a
nounPhraseSent NPStructG a
s = NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase NPStructG a
s (NPStructG a -> PluralRule -> NPStructG a
forall a. NPStructG a -> PluralRule -> NPStructG a
sPlur NPStructG a
s PluralRule
AddS) CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapWords
compoundPhrase :: (NounPhrase ta a, NounPhrase tb a) => ta -> tb -> NPG a
compoundPhrase :: forall ta a tb.
(NounPhrase ta a, NounPhrase tb a) =>
ta -> tb -> NPG a
compoundPhrase ta
t1 tb
t2 = NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase
(ta -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
phraseNP ta
t1 NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: tb -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
phraseNP tb
t2) (ta -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
phraseNP ta
t1 NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: tb -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
pluralNP tb
t2) CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapWords
compoundPhrase' :: NPG a -> NPG a -> NPG a
compoundPhrase' :: forall a. NPG a -> NPG a -> NPG a
compoundPhrase' NPG a
t1 NPG a
t2 = NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase
(NPG a -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
phraseNP NPG a
t1 NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NPG a -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
phraseNP NPG a
t2) (NPG a -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
phraseNP NPG a
t1 NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NPG a -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
pluralNP NPG a
t2) CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapWords CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapWords
compoundPhrase'' :: (NPG a -> NPStructG a) -> (NPG a -> NPStructG a) -> NPG a -> NPG a -> NPG a
compoundPhrase'' :: forall a.
(NPG a -> NPStructG a)
-> (NPG a -> NPStructG a) -> NPG a -> NPG a -> NPG a
compoundPhrase'' NPG a -> NPStructG a
f1 NPG a -> NPStructG a
f2 NPG a
t1 NPG a
t2 = NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase
(NPG a -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
phraseNP NPG a
t1 NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NPG a -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
phraseNP NPG a
t2) (NPG a -> NPStructG a
f1 NPG a
t1 NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NPG a -> NPStructG a
f2 NPG a
t2) CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapWords CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapWords
compoundPhrase''' :: (NPG a -> NPStructG a) -> NPG a -> NPG a -> NPG a
compoundPhrase''' :: forall a. (NPG a -> NPStructG a) -> NPG a -> NPG a -> NPG a
compoundPhrase''' NPG a -> NPStructG a
f1 NPG a
t1 NPG a
t2 = NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
forall a.
NPStructG a
-> NPStructG a
-> CapitalizationRuleG a
-> CapitalizationRuleG a
-> NPG a
Phrase
(NPG a -> NPStructG a
f1 NPG a
t1 NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NPG a -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
phraseNP NPG a
t2) (NPG a -> NPStructG a
f1 NPG a
t1 NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NPG a -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
pluralNP NPG a
t2) CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapWords
compoundPhraseP1 :: NPG a -> NPG a -> NPG a
compoundPhraseP1 :: forall a. NPG a -> NPG a -> NPG a
compoundPhraseP1 = (NPG a -> NPStructG a) -> NPG a -> NPG a -> NPG a
forall a. (NPG a -> NPStructG a) -> NPG a -> NPG a -> NPG a
compoundPhrase''' NPG a -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
pluralNP
atStartNP, atStartNP' :: NounPhrase n a => n -> Capitalization a
atStartNP :: forall n a. NounPhrase n a => n -> NPStructG a
atStartNP n
n = n -> (n -> NPStructG a) -> NPStructG a
forall n a.
NounPhrase n a =>
n -> (n -> NPStructG a) -> NPStructG a
sentenceCase n
n n -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
phraseNP
atStartNP' :: forall n a. NounPhrase n a => n -> NPStructG a
atStartNP' n
n = n -> (n -> NPStructG a) -> NPStructG a
forall n a.
NounPhrase n a =>
n -> (n -> NPStructG a) -> NPStructG a
sentenceCase n
n n -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
pluralNP
titleizeNP, titleizeNP' :: NounPhrase n a => n -> Capitalization a
titleizeNP :: forall n a. NounPhrase n a => n -> NPStructG a
titleizeNP n
n = n -> (n -> NPStructG a) -> NPStructG a
forall n a.
NounPhrase n a =>
n -> (n -> NPStructG a) -> NPStructG a
titleCase n
n n -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
phraseNP
titleizeNP' :: forall n a. NounPhrase n a => n -> NPStructG a
titleizeNP' n
n = n -> (n -> NPStructG a) -> NPStructG a
forall n a.
NounPhrase n a =>
n -> (n -> NPStructG a) -> NPStructG a
titleCase n
n n -> NPStructG a
forall n a. NounPhrase n a => n -> NPStructG a
pluralNP
sPlur :: NPStructG a -> PluralRule -> NPStructG a
sPlur :: forall a. NPStructG a -> PluralRule -> NPStructG a
sPlur (SC String
s) PluralRule
AddS = String -> NPStructG a
forall a. String -> NPStructG a
SC (String
s String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"s")
sPlur (SC String
s) PluralRule
AddE = String -> NPStructG a
forall a. String -> NPStructG a
SC (String
s String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"e")
sPlur s :: NPStructG a
s@(SC String
_) PluralRule
AddES = NPStructG a -> PluralRule -> NPStructG a
forall a. NPStructG a -> PluralRule -> NPStructG a
sPlur (NPStructG a -> PluralRule -> NPStructG a
forall a. NPStructG a -> PluralRule -> NPStructG a
sPlur NPStructG a
s PluralRule
AddE) PluralRule
AddS
sPlur s :: NPStructG a
s@(SC String
_) PluralRule
SelfPlur = NPStructG a
s
sPlur (SC String
sts) (IrregPlur String -> String
f) = String -> NPStructG a
forall a. String -> NPStructG a
SC (String -> NPStructG a) -> String -> NPStructG a
forall a b. (a -> b) -> a -> b
$ String -> String
f String
sts
sPlur (NPStructG a
a :+!: NPStructG a
b) PluralRule
pt = NPStructG a
a NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NPStructG a -> PluralRule -> NPStructG a
forall a. NPStructG a -> PluralRule -> NPStructG a
sPlur NPStructG a
b PluralRule
pt
sPlur (NPStructG a
a :-!: NPStructG a
b) PluralRule
pt = NPStructG a
a NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: NPStructG a -> PluralRule -> NPStructG a
forall a. NPStructG a -> PluralRule -> NPStructG a
sPlur NPStructG a
b PluralRule
pt
sPlur NPStructG a
a PluralRule
_ = String -> NPStructG a
forall a. String -> NPStructG a
SC String
"MISSING PLURAL FOR:" NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NPStructG a
a
cap :: NPStructG a -> CapitalizationRuleG a -> NPStructG a
cap :: forall a. NPStructG a -> CapitalizationRuleG a -> NPStructG a
cap NPStructG a
_ (Replace NPStructG a
s) = NPStructG a
s
cap NPStructG a
s CapitalizationRuleG a
CapNothing = NPStructG a
s
cap (SC []) CapitalizationRuleG a
CapFirst = String -> NPStructG a
forall a. String -> NPStructG a
SC []
cap (SC (Char
s:String
ss)) CapitalizationRuleG a
CapFirst = String -> NPStructG a
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 a
CapWords = String -> (String -> String) -> (String -> String) -> NPStructG a
forall a.
String -> (String -> String) -> (String -> String) -> NPStructG a
capString String
s String -> String
capFirstWord String -> String
capWords
cap (PC a
symb :+!: NPStructG a
x) CapitalizationRuleG a
CapFirst = a -> NPStructG a
forall a. a -> NPStructG a
PC a
symb NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NPStructG a
x
cap (PC a
symb :+!: NPStructG a
x) CapitalizationRuleG a
CapWords = a -> NPStructG a
forall a. a -> NPStructG a
PC a
symb NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NPStructG a
x
cap (NPStructG a
s1 :+!: NPStructG a
s2) CapitalizationRuleG a
CapWords = NPStructG a -> CapitalizationRuleG a -> NPStructG a
forall a. NPStructG a -> CapitalizationRuleG a -> NPStructG a
cap NPStructG a
s1 CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapWords NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a
capTail NPStructG a
s2
cap (NPStructG a
s1 :+!: NPStructG a
s2) CapitalizationRuleG a
CapFirst = NPStructG a -> CapitalizationRuleG a -> NPStructG a
forall a. NPStructG a -> CapitalizationRuleG a -> NPStructG a
cap NPStructG a
s1 CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NPStructG a
s2
cap (PC a
symb :-!: NPStructG a
x) CapitalizationRuleG a
CapFirst = a -> NPStructG a
forall a. a -> NPStructG a
PC a
symb NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: NPStructG a
x
cap (PC a
symb :-!: NPStructG a
x) CapitalizationRuleG a
CapWords = a -> NPStructG a
forall a. a -> NPStructG a
PC a
symb NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: NPStructG a
x
cap (NPStructG a
s1 :-!: NPStructG a
s2) CapitalizationRuleG a
CapWords = NPStructG a -> CapitalizationRuleG a -> NPStructG a
forall a. NPStructG a -> CapitalizationRuleG a -> NPStructG a
cap NPStructG a
s1 CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapWords NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a
capTail NPStructG a
s2
cap (NPStructG a
s1 :-!: NPStructG a
s2) CapitalizationRuleG a
CapFirst = NPStructG a -> CapitalizationRuleG a -> NPStructG a
forall a. NPStructG a -> CapitalizationRuleG a -> NPStructG a
cap NPStructG a
s1 CapitalizationRuleG a
forall a. CapitalizationRuleG a
CapFirst NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: NPStructG a
s2
cap (PC a
p) CapitalizationRuleG a
_ = a -> NPStructG a
forall a. a -> NPStructG a
PC a
p
capTail :: NPStructG a -> NPStructG a
capTail :: forall a. NPStructG a -> NPStructG a
capTail (SC String
s) = String -> (String -> String) -> (String -> String) -> NPStructG a
forall a.
String -> (String -> String) -> (String -> String) -> NPStructG a
capString String
s String -> String
capWords String -> String
capWords
capTail (PC a
symb :+!: NPStructG a
b) = a -> NPStructG a
forall a. a -> NPStructG a
PC a
symb NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NPStructG a
b
capTail (NPStructG a
a :+!: NPStructG a
b) = NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a
capTail NPStructG a
a NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a
capTail NPStructG a
b
capTail (PC a
symb :-!: NPStructG a
b) = a -> NPStructG a
forall a. a -> NPStructG a
PC a
symb NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: NPStructG a
b
capTail (NPStructG a
a :-!: NPStructG a
b) = NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a
capTail NPStructG a
a NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a
capTail NPStructG a
b
capTail (PC a
p) = a -> NPStructG a
forall a. a -> NPStructG a
PC a
p
capString :: String -> (String -> String) -> (String -> String) -> NPStructG a
capString :: forall a.
String -> (String -> String) -> (String -> String) -> NPStructG a
capString String
s String -> String
f String -> String
g = String -> NPStructG a
forall a. String -> NPStructG a
SC (String -> NPStructG a)
-> ([String] -> String) -> [String] -> NPStructG a
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] -> NPStructG a) -> [String] -> NPStructG a
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]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap 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 -> NPStructG a -> NPStructG a
surroundNPStruct :: forall a. String -> String -> NPStructG a -> NPStructG a
surroundNPStruct String
l String
r (SC String
s) = String -> NPStructG a
forall a. String -> NPStructG a
SC (String -> NPStructG a) -> String -> NPStructG a
forall a b. (a -> b) -> a -> b
$ String
l String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
s String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
r
surroundNPStruct String
l String
r (NPStructG a
s1 :+!: NPStructG a
s2) = String -> String -> NPStructG a -> NPStructG a
forall a. String -> String -> NPStructG a -> NPStructG a
surroundNPStruct String
l String
"" NPStructG a
s1 NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:+!: String -> String -> NPStructG a -> NPStructG a
forall a. String -> String -> NPStructG a -> NPStructG a
surroundNPStruct String
"" String
r NPStructG a
s2
surroundNPStruct String
l String
r (NPStructG a
s1 :-!: NPStructG a
s2) = String -> String -> NPStructG a -> NPStructG a
forall a. String -> String -> NPStructG a -> NPStructG a
surroundNPStruct String
l String
"" NPStructG a
s1 NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: String -> String -> NPStructG a -> NPStructG a
forall a. String -> String -> NPStructG a -> NPStructG a
surroundNPStruct String
"" String
r NPStructG a
s2
surroundNPStruct String
l String
r (PC a
p) = String -> NPStructG a
forall a. String -> NPStructG a
SC String
l NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: a -> NPStructG a
forall a. a -> NPStructG a
PC a
p NPStructG a -> NPStructG a -> NPStructG a
forall a. NPStructG a -> NPStructG a -> NPStructG a
:-!: String -> NPStructG a
forall a. String -> NPStructG a
SC String
r