diff --git a/src/Data/String.js b/src/Data/String.js index e4a44ad..eb3fb93 100644 --- a/src/Data/String.js +++ b/src/Data/String.js @@ -139,6 +139,17 @@ exports.split = function (sep) { }; }; +exports._splitAt = function (just) { + return function (nothing) { + return function (i) { + return function (s) { + return i >= 0 && i < s.length ? + just([s.substring(0, i), s.substring(i)]) : nothing; + }; + }; + }; +}; + exports.toCharArray = function (s) { return s.split(""); }; diff --git a/src/Data/String.purs b/src/Data/String.purs index 1e0d6d2..b7d8213 100644 --- a/src/Data/String.purs +++ b/src/Data/String.purs @@ -25,6 +25,7 @@ module Data.String , stripSuffix , count , split + , splitAt , toCharArray , toLower , toUpper @@ -197,6 +198,16 @@ foreign import count :: (Char -> Boolean) -> String -> Int -- | * `split " " "hello world" == ["hello", "world"]` foreign import split :: String -> String -> Array String +-- | Returns the substrings of split at the given index, if the index is within bounds. +splitAt :: Int -> String -> Maybe (Array String) +splitAt = _splitAt Just Nothing + +foreign import _splitAt :: (forall a. a -> Maybe a) + -> (forall a. Maybe a) + -> Int + -> String + -> Maybe (Array String) + -- | Converts the string into an array of characters. foreign import toCharArray :: String -> Array Char diff --git a/test/Test/Data/String.purs b/test/Test/Data/String.purs index 4ae805e..0ca90ba 100644 --- a/test/Test/Data/String.purs +++ b/test/Test/Data/String.purs @@ -155,6 +155,13 @@ testString = do assert $ split "b" "aabcc" == ["aa", "cc"] assert $ split "d" "abc" == ["abc"] + log "splitAt" + assert $ splitAt 1 "" == Nothing + assert $ splitAt 0 "a" == Just ["", "a"] + assert $ splitAt 1 "ab" == Just ["a", "b"] + assert $ splitAt 3 "aabcc" == Just ["aab", "cc"] + assert $ splitAt (-1) "abc" == Nothing + log "toCharArray" assert $ toCharArray "" == [] assert $ toCharArray "a" == ['a']