diff --git a/exercises/phone-number/PhoneNumber.example b/exercises/phone-number/PhoneNumber.example index df545b5..c5271a3 100644 --- a/exercises/phone-number/PhoneNumber.example +++ b/exercises/phone-number/PhoneNumber.example @@ -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) + ] diff --git a/exercises/phone-number/PhoneNumberTests.elm b/exercises/phone-number/PhoneNumberTests.elm index c0af62b..1a116dd 100644 --- a/exercises/phone-number/PhoneNumberTests.elm +++ b/exercises/phone-number/PhoneNumberTests.elm @@ -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")) ]