Sha256: aea248e661b490bb2788fd8e0d0154e639679711cd0312f837690620448db2d6

Contents?: true

Size: 1.25 KB

Versions: 396

Compression:

Stored size: 1.25 KB

Contents

module Say (inEnglish) where

import Data.Monoid ((<>))
import Data.Array (Array, listArray, (!))

smallNumbers :: Array Int String
smallNumbers = listArray (1, 19)
               [ "one", "two", "three", "four", "five", "six", "seven", "eight"
               , "nine", "ten", "eleven", "twelve", "thirteen", "fourteen"
               , "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" ]

tens :: Array Int String
tens = listArray (2, 9)
       [ "twenty", "thirty", "forty", "fifty"
       , "sixty", "seventy", "eighty", "ninety" ]

inEnglish :: Integral a => a -> Maybe String
inEnglish 0 = Just "zero"
inEnglish n0 | n0 > 0 && n0 < 1000000000000 = go n0 places
             | otherwise                    = Nothing
  where
    go 0 _ = Nothing
    go n ((place, name):ps)
      | n < place = go n ps
      | otherwise = go q hundreds <> Just (' ':name) <> ((' ':) <$> go r ps)
      where (q, r) = n `quotRem` place
    go n [] | n >= 1 && n < 20 = Just (smallNumbers ! fromIntegral n)
            | otherwise = Just (tens ! fromIntegral q) <> (('-':) <$> go r [])
      where (q, r) = n `quotRem` 10
    hundreds = [(100, "hundred")]
    places = (1000000000, "billion"):
             (1000000, "million"):
             (1000, "thousand"):
             hundreds

Version data entries

396 entries across 396 versions & 1 rubygems

Version Path
trackler-2.2.1.180 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.179 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.178 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.177 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.176 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.175 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.174 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.173 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.172 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.171 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.170 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.169 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.167 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.166 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.165 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.164 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.163 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.162 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.161 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs
trackler-2.2.1.160 tracks/haskell/exercises/say/examples/success-standard/src/Say.hs