ordinal-0.2.0.0: src/Text/Numerals/Prefix.hs
{-# LANGUAGE OverloadedStrings #-}
{-|
Module : Text.Numerals.Prefix
Description : A module used to define /numeric prefixes/ for /long/ and /short scales/.
Maintainer : hapytexeu+gh@gmail.com
Stability : experimental
Portability : POSIX
A module that defines /Latin/ prefixes. These prefixes are used to construct names for the /long/ and /short scales/.
So the /m/, /b/, /tr/ in /million/, /billion/, /trillion/.
-}
module Text.Numerals.Prefix (
-- * Latin prefixes
latinPrefixes, latinPrefixes', latinPrefix
) where
import Data.Text(Text)
import Data.Vector(Vector, (!?), fromList)
-- | A list of /Latin/ prefixes, used for the /long/ and /short scale/.
latinPrefixes' :: [Text] -- ^ A list of 'Text' objects. This makes explicit recursion more convenient.
latinPrefixes' = [
"m"
, "b"
, "tr"
, "quadr"
, "quint"
, "sext"
, "sept"
, "oct"
, "non"
, "dec"
, "undec"
, "duodec"
, "tredec"
, "quattuordec"
, "quindec"
, "sedec"
, "septendec"
, "octodec"
, "novendec"
, "vigint"
, "unvigint"
, "duovigint"
, "tresvigint"
, "quattuorvigint"
, "quinvigint"
, "sesvigint"
, "septemvigint"
, "octovigint"
, "novemvigint"
, "trigint"
, "untrigint"
, "duotrigint"
, "trestrigint"
, "quattuortrigint"
, "quintrigint"
, "sestrigint"
, "septentrigint"
, "octotrigint"
, "noventrigint"
, "quadragint"
]
-- | The /Latin/ prefixes in a 'Vector' for /O(1)/ lookup.
latinPrefixes :: Vector Text -- ^ A 'Vector' of 'Text' objects to allow fast lookup.
latinPrefixes = fromList latinPrefixes'
-- | Lookup the given /Latin/ prefix for the given value.
latinPrefix :: Integral i
=> i -- ^ The value to map on a Latin prefix.
-> Maybe Text -- ^ The corresponding Latin prefix, given this exists.
latinPrefix n = latinPrefixes !? (fromIntegral n - 1)