module Text.Numeral.Language.HE
(
entry
, cardinal
, struct
, bounds
) where
import "base" Data.Function ( ($), fix )
import "base" Data.List ( concat )
import "base" Data.Maybe ( Maybe(Just) )
import "base" Prelude ( Integral, (+), div, negate )
import "base-unicode-symbols" Data.Function.Unicode ( (∘) )
import "base-unicode-symbols" Data.Monoid.Unicode ( (⊕) )
import "base-unicode-symbols" Data.Ord.Unicode ( (≤) )
import qualified "containers" Data.Map as M ( fromList, lookup )
import "this" Text.Numeral
import qualified "this" Text.Numeral.Exp as E
import "this" Text.Numeral.Grammar ( Inflection )
import "this" Text.Numeral.Entry
import "text" Data.Text ( Text )
entry ∷ Entry
entry = emptyEntry
{ entIso639_1 = Just "he"
, entIso639_2 = ["heb"]
, entIso639_3 = Just "heb"
, entNativeNames = ["עִבְרִית"]
, entEnglishName = Just "Modern Hebrew"
, entCardinal = Just Conversion
{ toNumeral = cardinal
, toStructure = struct
}
}
cardinal ∷ (Inflection i, Integral α) ⇒ i → α → Maybe Text
cardinal inf = cardinalRepr inf ∘ struct
struct ∷ ( Integral α
, E.Unknown β, E.Lit β, E.Neg β, E.Add β, E.Mul β, E.Dual β, E.Plural β
)
⇒ α → β
struct = pos
$ fix
$ findRule ( 0, lit)
( [ (11, add 10 L)
, (20, dual ∘ mapRule (`div` 10) lit)
, (21, add 20 R)
]
⊕ concat [ [ (n, plural ∘ mapRule (`div` 10) lit)
, (n+1, add n R)
]
| n ← [20,30..90]
]
⊕ [ (100, step 100 10 R L)
, (200, dual ∘ mapRule (`div` 2) lit)
, (201, add 200 R)
, (300, step 100 10 R L)
]
)
1000
bounds ∷ (Integral α) ⇒ (α, α)
bounds = let x = 1000 in (negate x, x)
cardinalRepr ∷ i → Exp i → Maybe Text
cardinalRepr = render defaultRepr
{ reprValue = \_ n → M.lookup n syms
, reprAdd = Just (⊞)
, reprMul = Just (⊡)
, reprNeg = Just $ \_ _ → "מינוס "
, reprAddCombine = Just addCombine
}
where
(_ ⊞ Lit 10) _ = "ה"
(Dual _ ⊞ _ ) _ = " ו"
(Plural _ ⊞ _ ) _ = " ו"
(_ ⊞ _ ) _ = " "
(_ ⊡ Lit 10) _ = ""
(_ ⊡ _ ) _ = " "
addCombine a x _ y (Lit 10) = x ⊕ " " ⊕ y ⊕ a
addCombine a x _ y _ = x ⊕ a ⊕ y
syms =
M.fromList
[ (0, \c → case c of
_ → "אפס"
)
, (1, \c → case c of
_ → "אחת"
)
, (2, \c → case c of
CtxAdd _ (Lit 10) _ → "שתים"
CtxDual {} → "עשרים"
_ → "שתיים"
)
, (3, \c → case c of
CtxPlural {} → "שלושים"
_ → "שלוש"
)
, (4, \c → case c of
CtxPlural {} → "ארבעים"
_ → "ארבע"
)
, (5, \c → case c of
CtxPlural {} → "חמישים"
_ → "חמש"
)
, (6, \c → case c of
CtxPlural {} → "ששים"
_ → "שש"
)
, (7, \c → case c of
CtxPlural {} → "שבעים"
_ → "שבע"
)
, (8, \c → case c of
CtxPlural {} → "שמונים"
_ → "שמונה"
)
, (9, \c → case c of
CtxPlural {} → "תשעים"
_ → "תשע"
)
, (10, \c → case c of
CtxMul _ (Lit n) _ | n ≤ 9 → ""
_ → "עשר"
)
, (100, \c → case c of
CtxDual {} → "מאתיים"
CtxMul {} → "מאות"
_ → "מאה"
)
, (1000, \c → case c of
_ → "אלף"
)
]