module Text.Numeral.Language.EN
( uk_cardinal
, ukPelletier_cardinal
, us_cardinal
, shortScaleStruct
, longScaleStruct
, pelletierScaleStruct
) where
import "base" Data.Bool ( otherwise )
import "base" Data.Function ( ($), const, fix )
import "base" Data.Maybe ( Maybe(Just) )
import "base" Data.Monoid ( Monoid )
import "base" Data.Ord ( (<) )
import "base" Data.String ( IsString )
import "base" Prelude ( Integral, (), Integer )
import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
import qualified "containers" Data.Map as M ( fromList, lookup )
import "numerals-base" Text.Numeral
import "numerals-base" Text.Numeral.Misc ( dec )
import qualified "numerals-base" Text.Numeral.Exp.Classes as C
import qualified "numerals-base" Text.Numeral.BigNum as BN ( rule, scaleRepr, pelletierRepr )
uk_cardinal ∷ (Integral α, C.Scale α, Monoid s, IsString s) ⇒ α → Maybe s
uk_cardinal = render uk_cardinalRepr' ∘ shortScaleStruct
ukPelletier_cardinal ∷ (Integral α, C.Scale α, Monoid s, IsString s)
⇒ α → Maybe s
ukPelletier_cardinal = render uk_cardinalRepr' { reprScale = pelletierRepr }
∘ pelletierScaleStruct
where
pelletierRepr = BN.pelletierRepr "illion" "illion"
"illiard" "illiard"
[]
us_cardinal ∷ (Integral α, C.Scale α, Monoid s, IsString s) ⇒ α → Maybe s
us_cardinal = render (cardinalRepr (⊞)) ∘ shortScaleStruct
where
((_ `Mul` Lit 10) ⊞ _) _ = "-"
((_ `Mul` _ ) ⊞ _) _ = " "
(_ ⊞ _) _ = ""
shortScaleStruct ∷ ( Integral α, C.Scale α
, C.Unknown β, C.Lit β, C.Neg β, C.Add β, C.Mul β, C.Scale β
)
⇒ α → β
shortScaleStruct = pos $ fix $ rule `combine` shortScale1 R L BN.rule
longScaleStruct ∷ ( Integral α, C.Scale α
, C.Unknown β, C.Lit β, C.Neg β, C.Add β, C.Mul β, C.Scale β
)
⇒ α → β
longScaleStruct = pos $ fix $ rule `combine` longScale1 R L BN.rule
pelletierScaleStruct ∷ ( Integral α, C.Scale α
, C.Unknown β, C.Lit β, C.Neg β, C.Add β, C.Mul β, C.Scale β
)
⇒ α → β
pelletierScaleStruct = pos $ fix $ rule `combine` pelletierScale1 R L BN.rule
rule ∷ (Integral α, C.Unknown β, C.Lit β, C.Add β, C.Mul β) ⇒ Rule α β
rule = findRule ( 0, lit )
[ ( 13, add 10 L )
, ( 20, mul 10 R L)
, ( 100, step1 100 10 R L)
, (1000, step1 1000 1000 R L)
]
(dec 6 1)
uk_cardinalRepr' ∷ (Monoid s, IsString s) ⇒ Repr s
uk_cardinalRepr' = cardinalRepr (⊞)
where
((_ `Mul` Lit 10) ⊞ _) _ = "-"
((_ `Mul` _ ) ⊞ x) _
| eval x < (100 ∷ Integer) = " and "
| otherwise = " "
(_ ⊞ _) _ = ""
cardinalRepr ∷ (Monoid s, IsString s) ⇒ (Exp → Exp → Ctx Exp → s) → Repr s
cardinalRepr f =
defaultRepr
{ reprValue = \n → M.lookup n syms
, reprScale = BN.scaleRepr "illion" "illion" []
, reprAdd = Just f
, reprMul = Just (⊞)
, reprNeg = Just $ \_ _ → "minus "
}
where
(_ ⊞ Lit 10) _ = ""
(_ ⊞ _ ) _ = " "
syms =
M.fromList
[ (0, const "zero")
, (1, const "one")
, (2, ten "two" "two" "twen")
, (3, ten "three" "thir" "thir")
, (4, ten "four" "four" "for")
, (5, ten "five" "fif" "fif")
, (6, const "six")
, (7, const "seven")
, (8, ten "eight" "eigh" "eigh")
, (9, const "nine")
, (10, \c → case c of
CtxAdd _ (Lit _) _ → "teen"
CtxMul R _ _ → "ty"
_ → "ten"
)
, (11, const "eleven")
, (12, const "twelve")
, (100, const "hundred")
, (1000, const "thousand")
]
ten ∷ s → s → s → Ctx Exp → s
ten n a m = \c → case c of
CtxAdd _ (Lit 10) _ → a
CtxMul _ (Lit 10) _ → m
_ → n