diff --git a/README.md b/README.md index 7936748..770a294 100644 --- a/README.md +++ b/README.md @@ -33,8 +33,12 @@ charCodeAt :: Number -> String -> Maybe Number + count :: (Char -> Boolean) -> String -> Number + drop :: Number -> String -> String + dropWhile :: (Char -> Boolean) -> String -> String + fromChar :: Char -> String fromCharArray :: [Char] -> String @@ -53,12 +57,18 @@ localeCompare :: String -> String -> Number + null :: String -> Boolean + replace :: String -> String -> String -> String + singleton :: Char -> String + split :: String -> String -> [String] take :: Number -> String -> String + takeWhile :: (Char -> Boolean) -> String -> String + toCharArray :: String -> [Char] toLower :: String -> String @@ -67,6 +77,8 @@ trim :: String -> String + uncons :: String -> Maybe { tail :: String, head :: Char } + ## Module Data.String.Regex @@ -74,7 +86,7 @@ data Regex :: * - type RegexFlags = { unicode :: Boolean, sticky :: Boolean, multiline :: Boolean, ignoreCase :: Boolean, global :: Boolean } + type RegexFlags = { unicode :: Boolean, sticky :: Boolean, multiline :: Boolean, ignoreCase :: Boolean, global :: Boolean } ### Type Class Instances diff --git a/src/Data/String.purs b/src/Data/String.purs index 08c86a4..09e2714 100644 --- a/src/Data/String.purs +++ b/src/Data/String.purs @@ -8,11 +8,17 @@ module Data.String indexOf', lastIndexOf, lastIndexOf', + null, + uncons, length, + singleton, localeCompare, replace, + count, take, + takeWhile, drop, + dropWhile, split, toCharArray, toLower, @@ -24,6 +30,7 @@ module Data.String import Data.Maybe import Data.Char import Data.Function + import qualified Data.String.Unsafe as U foreign import _charAt """ @@ -38,6 +45,9 @@ module Data.String fromChar :: Char -> String fromChar = charString + singleton :: Char -> String + singleton = fromChar + foreign import _charCodeAt """ function _charCodeAt(i, s, Just, Nothing) { @@ -48,6 +58,19 @@ module Data.String charCodeAt :: Number -> String -> Maybe Number charCodeAt n s = runFn4 _charCodeAt n s Just Nothing + null :: String -> Boolean + null s = length s == 0 + + uncons :: String -> Maybe {head :: Char, tail :: String} + uncons s | null s = Nothing + uncons s = Just {head : U.charAt 0 s, tail : drop 1 s} + + takeWhile :: (Char -> Boolean) -> String -> String + takeWhile p s = take (count p s) s + + dropWhile :: (Char -> Boolean) -> String -> String + dropWhile p s = drop (count p s) s + foreign import fromCharArray """ function fromCharArray(a) { @@ -140,6 +163,17 @@ module Data.String } """ :: Number -> String -> String + foreign import count + """ + function count(p){ + return function(s){ + var i; + for(i = 0; i < s.length && p(s.charAt(i)); i++){}; + return i; + }; + } + """ :: (Char -> Boolean) -> String -> Number + foreign import split """ function split(sep) {