module Format ( number , compare , unaccent ) where import Data.Int (toNumber, fromNumber) import Data.Array (replicate) import Data.Maybe (fromMaybe) import Data.String (length, joinWith, fromCharArray, toCharArray, toLower) import Math (round, trunc, pow) import Prelude hiding (compare) import Prelude as Prelude number :: Int -> Number -> String number decimalLength num = formattedIntegerPart <> formattedDecimalPart where formattedIntegerPart = (if decimalLength > 0 then trunc num else round num) # fromNumber # fromMaybe 0 # show formattedDecimalPart = if decimalLength > 0 then ((num - trunc num) * pow 10.0 (toNumber decimalLength)) # round # fromNumber # fromMaybe 0 # show # \str -> "," <> (joinWith "" $ replicate (decimalLength - length str) "0") <> str else "" compare :: String -> String -> Ordering compare xs ys = Prelude.compare (formatString xs) (formatString ys) where formatString = unaccent <<< toLower unaccent :: String -> String unaccent = fromCharArray <<< map unaccentChar <<< toCharArray where unaccentChar :: Char -> Char unaccentChar c = case c of 'à' -> 'a' 'á' -> 'a' 'â' -> 'a' 'ã' -> 'a' 'ä' -> 'a' 'ç' -> 'c' 'è' -> 'e' 'é' -> 'e' 'ê' -> 'e' 'ë' -> 'e' 'ì' -> 'i' 'í' -> 'i' 'î' -> 'i' 'ï' -> 'i' 'ñ' -> 'n' 'ò' -> 'o' 'ó' -> 'o' 'ô' -> 'o' 'õ' -> 'o' 'ö' -> 'o' 'š' -> 's' 'ù' -> 'u' 'ú' -> 'u' 'û' -> 'u' 'ü' -> 'u' 'ý' -> 'y' 'ÿ' -> 'y' 'ž' -> 'z' _ -> c