{-# LANGUAGE OverloadedLists, OverloadedStrings, TemplateHaskell #-}
module Text.Numerals.Languages.English (
english
, ordinize'
, negativeWord', zeroWord', oneWord'
, lowWords', midWords', highWords'
, merge'
) where
import Data.Text(Text, isSuffixOf)
import qualified Data.Text as T
import Data.Vector(Vector)
import Text.Numerals.Algorithm(HighNumberAlgorithm(ShortScale), NumeralsAlgorithm, numeralsAlgorithm)
import Text.Numerals.Algorithm.Template(ordinizeFromDict)
import Text.Numerals.Class(valueSplit)
import Text.Numerals.Internal(_mergeWith, _mergeWithSpace, _mergeWithHyphen)
_ordinizepp :: Text -> Text
_ordinizepp t
| "y" `isSuffixOf` t = T.init t <> "ieth"
| otherwise = t <> "th"
$(pure [ordinizeFromDict "ordinize'" [
("one", "first")
, ("two", "second")
, ("three", "third")
, ("four", "fourth")
, ("five", "fifth")
, ("six", "sixth")
, ("seven", "seventh")
, ("eight", "eighth")
, ("nine", "ninth")
, ("ten", "tenth")
, ("eleven", "eleventh")
, ("twelve", "twelfth")
] '_ordinizepp])
english :: NumeralsAlgorithm
english = numeralsAlgorithm negativeWord' zeroWord' oneWord' lowWords' midWords' (valueSplit highWords') merge' ordinize'
negativeWord' :: Text
negativeWord' = "minus"
zeroWord' :: Text
zeroWord' = "zero"
oneWord' :: Text
oneWord' = "one"
lowWords' :: Vector Text
lowWords' = [
"two"
, "three"
, "four"
, "five"
, "six"
, "seven"
, "eight"
, "nine"
, "ten"
, "eleven"
, "twelve"
, "thirteen"
, "fourteen"
, "fifteen"
, "sixteen"
, "seventeen"
, "eighteen"
, "nineteen"
, "twenty"
]
midWords' :: [(Integer, Text)]
midWords' = [
(1000, "thousand")
, (100, "hundred")
, (90, "ninety")
, (80, "eighty")
, (70, "seventy")
, (60, "sixty")
, (50, "fifty")
, (40, "forty")
, (30, "thirty")
]
merge' :: Integral i => i -> i -> Text -> Text -> Text
merge' 1 r | r < 100 = const id
merge' l r | 100 > l && l > r = _mergeWithHyphen
| l >= 100 && 100 > r = _mergeWith " and "
| r > l = _mergeWithSpace
merge' _ _ = _mergeWith ", "
highWords' :: HighNumberAlgorithm
highWords' = ShortScale "illion"