ordinal-0.6.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' ::
-- | A list of 'Text' objects. This makes explicit recursion more convenient.
[Text]
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 ::
-- | A 'Vector' of 'Text' objects to allow fast lookup.
Vector Text
latinPrefixes = fromList latinPrefixes'
-- | Lookup the given /Latin/ prefix for the given value.
latinPrefix ::
Integral i =>
-- | The value to map on a Latin prefix.
i ->
-- | The corresponding Latin prefix, given this exists.
Maybe Text
latinPrefix n = latinPrefixes !? (fromIntegral n - 1)