Revise phone-number to use Maybe

This commit is contained in:
Erik Simmler 2016-03-16 21:33:59 -04:00
parent 6b79102bac
commit 90e7d88374
2 changed files with 44 additions and 24 deletions

View file

@ -2,23 +2,43 @@ module PhoneNumber (..) where
import String
nums = ['1','2','3','4','5','6','7','8','9','0']
getNumber : String -> String
getNumber text = getValidNum (String.filter isDigit text)
nums =
[ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' ]
getNumber : String -> Maybe String
getNumber text =
getValidNum (String.filter isDigit text)
isDigit : Char -> Bool
isDigit char = List.any (\n -> n == char) nums
isDigit char =
List.any (\n -> n == char) nums
getValidNum : String -> String
getValidNum : String -> Maybe String
getValidNum num =
if String.length num == 10 then num else
if (String.length num == 11) && (String.left 1 num == "1") then String.dropLeft 1 num else
String.repeat 10 "0"
if String.length num == 10 then
Just num
else if (String.length num == 11) && (String.left 1 num == "1") then
Just (String.dropLeft 1 num)
else
Nothing
printPretty : String -> String
printPretty input = formatNumber (getNumber input)
prettyPrint : String -> Maybe String
prettyPrint input =
Maybe.map formatNumber (getNumber input)
formatNumber : String -> String
formatNumber input = String.concat ["(", (String.slice 0 3 input), ") ", (String.slice 3 6 input), "-", (String.slice 6 10 input)]
formatNumber input =
String.concat
[ "("
, (String.slice 0 3 input)
, ") "
, (String.slice 3 6 input)
, "-"
, (String.slice 6 10 input)
]

View file

@ -3,7 +3,7 @@ module Main (..) where
import Task
import Console
import ElmTest exposing (..)
import PhoneNumber exposing (getNumber, printPretty)
import PhoneNumber exposing (getNumber, prettyPrint)
tests : Test
@ -12,40 +12,40 @@ tests =
"PhoneNumber"
[ test
"cleans number"
(assertEqual "1234567890" (getNumber "(123) 456-7890"))
(assertEqual (Just "1234567890") (getNumber "(123) 456-7890"))
, test
"cleans number with dots"
(assertEqual "1234567890" (getNumber "123.456.7890"))
(assertEqual (Just "1234567890") (getNumber "123.456.7890"))
, test
"valid when 11 digits and first is 1"
(assertEqual "1234567890" (getNumber "11234567890"))
(assertEqual (Just "1234567890") (getNumber "11234567890"))
, test
"invalid when 11 digits"
(assertEqual "0000000000" (getNumber "21234567890"))
(assertEqual Nothing (getNumber "21234567890"))
, test
"invalid when 9 digits"
(assertEqual "0000000000" (getNumber "123456789"))
(assertEqual Nothing (getNumber "123456789"))
, test
"invalid when 12 digits"
(assertEqual "0000000000" (getNumber "123456789012"))
(assertEqual Nothing (getNumber "123456789012"))
, test
"invalid when empty"
(assertEqual "0000000000" (getNumber ""))
(assertEqual Nothing (getNumber ""))
, test
"invalid when no digits present"
(assertEqual "0000000000" (getNumber " (-) "))
(assertEqual Nothing (getNumber " (-) "))
, test
"valid with leading characters"
(assertEqual "1234567890" (getNumber "my number is 123 456 7890"))
(assertEqual (Just "1234567890") (getNumber "my number is 123 456 7890"))
, test
"valid with trailing characters"
(assertEqual "1234567890" (getNumber "123 456 7890 - bob"))
(assertEqual (Just "1234567890") (getNumber "123 456 7890 - bob"))
, test
"pretty print"
(assertEqual "(123) 456-7890" (printPretty "1234567890"))
(assertEqual (Just "(123) 456-7890") (prettyPrint "1234567890"))
, test
"pretty print with full us phone number"
(assertEqual "(123) 456-7890" (printPretty "11234567890"))
(assertEqual (Just "(123) 456-7890") (prettyPrint "11234567890"))
]