{- |
Module      :  $Header$
Description :  Converts arabic numerals to roman numerals
Copyright   :  (c) Alexander Hakki
License     :  BSD3

Maintainer  :  ahk@ahakki.xyz
Stability   :  experimental
Portability :  portable
-}



module Roman.Encode
    ( toRoman
    ) where



toRoman :: Integral a => a -> String

toRoman a
    | a >= 1000 =
        "M" ++ toRoman (a - 1000)

    | a >= 900 =
        "CM" ++ toRoman (a - 900)

    | a >= 500 =
        "D" ++ toRoman (a - 500)

    | a >= 400 =
        "CD" ++ toRoman (a - 400)

    | a >= 100 =
        "C" ++ toRoman (a - 100)

    | a >= 90 =
        "XC" ++ toRoman (a - 90)

    | a >= 50 =
        "L" ++ toRoman (a - 50)

    | a >= 40 =
        "XL" ++ toRoman (a - 40)

    | a >= 10 =
        "X" ++ toRoman (a - 10)

    | a >= 9 =
        "IX" ++ toRoman (a - 9)

    | a >= 5 =
        "V" ++ toRoman (a - 5)

    | a == 4 =
        "IV"

    | a >= 1 =
        "I" ++ toRoman (a - 1)

    | a == 0 =
        ""

    | a < 0 =
        toRoman (negate a)

    | otherwise =
        error "why?"