-- -*- coding: utf-8 -*-

{-# LANGUAGE CPP, OverloadedStrings #-}

module Text.Numeral.Language.JA (ja) where

import Data.String
import Text.Numeral
import Text.Numeral.Joinable
import Text.Numeral.Misc (d, withSnd)

#ifdef DO_SPECIALISE
import qualified Data.ByteString as B
import qualified Data.DString    as DS

{-# SPECIALISE ja :: NumConfig String #-}
{-# SPECIALISE ja :: NumConfig B.ByteString #-}
{-# SPECIALISE ja :: NumConfig DS.DString #-}
#endif

ja :: (IsString s, Joinable s) => NumConfig s
ja = NumConfig { ncNeg      = ("mainasu" <+>)
               , ncOne      = jaOne
               , ncAdd      = withSnd (<+>)
               , ncMul      = withSnd (<->)
               , ncCardinal = findSym jaTable
               }

jaOne :: (IsString s, Joinable s) => (Integer, s) -> s
jaOne (v, vs) | v < 100 || (300 >= v && v < 400) = vs
              | otherwise = "ichi" <-> vs

jaTable :: (IsString s, Joinable s) => [NumSymbol s]
jaTable = [ term 0         $ const "rei"
          , term 1         $ const "ichi"
          , term 2         $ const "ni"
          , term 3         $ const "san"
          , term 4         $ const "yon"
          , term 5         $ const "go"
          , term 6         $ const "roku"
          , term 7         $ const "nana"
          , term 8         $ const "hachi"
          , term 9         $ const "kyū"
          , mul 10         $ const "jū"
          , mul 100        $ const "hyaku"
          , add 300    100 $ const "san-byaku" -- rendaku
          , mul 1000       $ const "sen"
          , mul (d 4)      $ const "man"
          , mul (d 8)      $ const "oku"
          , mul (d 12)     $ const "chō"
          , mul (d 16)     $ const "kei"
          , mul (d 20)     $ const "gai"
          , mul (d 24)     $ const "jo"
          , mul (d 28)     $ const "jō"
          , mul (d 32)     $ const "kō"
          , mul (d 36)     $ const "kan"
          , mul (d 40)     $ const "sei"
          , mul (d 44)     $ const "sai"
          , mul (d 48)     $ const "goku"
          , mul (d 52)     $ const "gōgasha"
          , mul (d 56)     $ const "asōgi"
          , mul (d 60)     $ const "nayuta"
          , mul (d 64)     $ const "fukashigi"
          , mul (d 68)     $ const "muryōtaisū"
          ]