module NLP.Antfarm.English where
import Data.Text ( Text )
import Data.Tree ( Tree(..) )
import qualified Data.Text as T
import NLP.Minimorph.English
import NLP.Minimorph.Number
import NLP.Minimorph.Util
import NLP.Antfarm.Refex
englishRx :: [Tree SubRx] -> Text
englishRx =
commas "and" . map (expand . fmap englishSubrx)
where
expand (Node main exs) = main <+> examples exs
examples [] = ""
examples xs = "(" <> T.intercalate ", " (map expand xs) <> ")"
englishSubrx :: SubRx -> Text
englishSubrx x =
T.unwords $ discr ++ [body]
where
num = srxNumber x
discr = englishDiscriminator (srxDet x) (srxDiscriminator x)
body = fromSP num $ srxWord x
englishDiscriminator :: SingPlu [Text]
-> Discriminator
-> [Text]
englishDiscriminator det discr =
case discr of
NilDiscriminator -> []
TheSame -> [ "the", "same" ]
TheOther -> [ "the", "other" ]
TheOrdinal n -> [ "the", ordinal n ]
NewOrdinal 2 -> [ "another" ]
NewOrdinal n -> [ indefiniteDet (ordinal n), ordinal n ]
Another 1 -> [ "another" ]
Another n -> [ "another", cardinal n ]
PlainCardinal 1 -> sg det
PlainCardinal n -> [ cardinal n ]
CardinalOfThe n -> [ cardinal n, "of", "the" ]
The -> [ "the" ]
Bounded (SayAtLeast n) -> [ "at", "least", cardinal n ]
Bounded (SayAtMost n) -> [ "at", "most" , cardinal n ]
Bounded (SayExactly n) -> [ "exactly", cardinal n ]
Bounded (SayBetween n m) -> [ "between", cardinal n, "and", cardinal m ]
Bounded (SayArbitrary t) -> [ t ]