module RomanNumerals exposing (toRoman)

import Dict
import Maybe


toRoman : Int -> String
toRoman number =
  if number == 0 then
    ""
  else
    let
      part = largestFactor number
      letter =
        numerals
        |> Dict.get part 
        |> Maybe.withDefault ""
    in
      letter ++ (toRoman (number - part))

largestFactor : Int -> Int
largestFactor number =
  numerals
  |> Dict.keys
  |> List.filter (\p -> p <= number)
  |> List.reverse
  |> List.head
  |> Maybe.withDefault 0


numerals : Dict.Dict Int String
numerals = Dict.fromList [
    (1000, "M"),
    ( 900, "CM"),
    ( 500, "D"),
    ( 400, "CD"),
    ( 100, "C"),
    (  90, "XC"),
    (  50, "L"),
    (  40, "XL"),
    (  10, "X"),
    (   9, "IX"),
    (   5, "V"),
    (   4, "IV"),
    (   1, "I")
  ]