From 8036395ba8a8e56c95f592929b6b29630edd6e81 Mon Sep 17 00:00:00 2001 From: NightRa Date: Fri, 21 Nov 2014 19:50:30 +0200 Subject: [PATCH 1/5] Added a null,singleton,uncons,takeWhile and dropWhile to Data.String --- README.md | 10 +++++++++- src/Data/String.purs | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7936748..b82584a 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,8 @@ drop :: Number -> String -> String + dropWhile :: (Char -> Boolean) -> String -> String + fromChar :: Char -> String fromCharArray :: [Char] -> String @@ -53,12 +55,16 @@ localeCompare :: String -> String -> Number + null :: String -> Boolean + replace :: String -> String -> String -> String split :: String -> String -> [String] take :: Number -> String -> String + takeWhile :: (Char -> Boolean) -> String -> String + toCharArray :: String -> [Char] toLower :: String -> String @@ -67,6 +73,8 @@ trim :: String -> String + uncons :: String -> Maybe { tail :: String, head :: Char } + ## Module Data.String.Regex @@ -74,7 +82,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..2470144 100644 --- a/src/Data/String.purs +++ b/src/Data/String.purs @@ -8,11 +8,15 @@ module Data.String indexOf', lastIndexOf, lastIndexOf', + null, + uncons, length, localeCompare, replace, take, + takeWhile, drop, + dropWhile, split, toCharArray, toLower, @@ -24,6 +28,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 +43,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 +56,13 @@ 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} + foreign import fromCharArray """ function fromCharArray(a) { @@ -131,6 +146,17 @@ module Data.String } """ :: Number -> String -> String + foreign import takeWhile + """ + function takeWhile(p){ + return function(s){ + var i; + for(i = 0; i < s.length && p(s.charAt(i)); i++){}; + return take(i)(s); + } + } + """ :: (Char -> Boolean) -> String -> String + foreign import drop """ function drop(n) { @@ -140,6 +166,17 @@ module Data.String } """ :: Number -> String -> String + foreign import dropWhile + """ + function dropWhile(p){ + return function(s){ + var i; + for(i = 0; i < s.length && p(s.charAt(i)); i++){}; + return drop(i)(s); + } + } + """ :: (Char -> Boolean) -> String -> String + foreign import split """ function split(sep) { From 51b67b675a9d3a4639242f4a86aff5312dd7b903 Mon Sep 17 00:00:00 2001 From: NightRa Date: Fri, 21 Nov 2014 19:53:16 +0200 Subject: [PATCH 2/5] Add singleton to the export list --- README.md | 2 ++ src/Data/String.purs | 1 + 2 files changed, 3 insertions(+) diff --git a/README.md b/README.md index b82584a..8390505 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,8 @@ replace :: String -> String -> String -> String + singleton :: Char -> String + split :: String -> String -> [String] take :: Number -> String -> String diff --git a/src/Data/String.purs b/src/Data/String.purs index 2470144..022849c 100644 --- a/src/Data/String.purs +++ b/src/Data/String.purs @@ -11,6 +11,7 @@ module Data.String null, uncons, length, + singleton, localeCompare, replace, take, From f444b910dbb1fc771f14307b284645877b2b0fdc Mon Sep 17 00:00:00 2001 From: NightRa Date: Fri, 21 Nov 2014 20:01:50 +0200 Subject: [PATCH 3/5] Added missing semicolons --- src/Data/String.purs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Data/String.purs b/src/Data/String.purs index 022849c..d010435 100644 --- a/src/Data/String.purs +++ b/src/Data/String.purs @@ -154,7 +154,7 @@ module Data.String var i; for(i = 0; i < s.length && p(s.charAt(i)); i++){}; return take(i)(s); - } + }; } """ :: (Char -> Boolean) -> String -> String @@ -174,7 +174,7 @@ module Data.String var i; for(i = 0; i < s.length && p(s.charAt(i)); i++){}; return drop(i)(s); - } + }; } """ :: (Char -> Boolean) -> String -> String From 87fde2ae311709dcac73e484888a9ee358f89b6f Mon Sep 17 00:00:00 2001 From: NightRa Date: Fri, 21 Nov 2014 21:15:54 +0200 Subject: [PATCH 4/5] Pass take&drop as parameters to the foreign function interface --- src/Data/String.purs | 33 +++++++++++++++------------------ 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/src/Data/String.purs b/src/Data/String.purs index d010435..73dc9cf 100644 --- a/src/Data/String.purs +++ b/src/Data/String.purs @@ -64,6 +64,12 @@ module Data.String uncons s | null s = Nothing uncons s = Just {head : U.charAt 0 s, tail : drop 1 s} + takeWhile :: (Char -> Boolean) -> String -> String + takeWhile = doAfter take + + dropWhile :: (Char -> Boolean) -> String -> String + dropWhile = doAfter drop + foreign import fromCharArray """ function fromCharArray(a) { @@ -147,17 +153,6 @@ module Data.String } """ :: Number -> String -> String - foreign import takeWhile - """ - function takeWhile(p){ - return function(s){ - var i; - for(i = 0; i < s.length && p(s.charAt(i)); i++){}; - return take(i)(s); - }; - } - """ :: (Char -> Boolean) -> String -> String - foreign import drop """ function drop(n) { @@ -167,16 +162,18 @@ module Data.String } """ :: Number -> String -> String - foreign import dropWhile + foreign import doAfter """ - function dropWhile(p){ - return function(s){ - var i; - for(i = 0; i < s.length && p(s.charAt(i)); i++){}; - return drop(i)(s); + function doAfter(f){ + return function(p){ + return function(s){ + var i; + for(i = 0; i < s.length && p(s.charAt(i)); i++){}; + return f(i)(s); + }; }; } - """ :: (Char -> Boolean) -> String -> String + """ :: (Number -> String -> String) -> (Char -> Boolean) -> String -> String foreign import split """ From 29e623690d23913a15d5919089f72ce171a02055 Mon Sep 17 00:00:00 2001 From: NightRa Date: Mon, 24 Nov 2014 21:41:19 +0200 Subject: [PATCH 5/5] Add the count function --- README.md | 2 ++ src/Data/String.purs | 23 +++++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 8390505..770a294 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ charCodeAt :: Number -> String -> Maybe Number + count :: (Char -> Boolean) -> String -> Number + drop :: Number -> String -> String dropWhile :: (Char -> Boolean) -> String -> String diff --git a/src/Data/String.purs b/src/Data/String.purs index 73dc9cf..09e2714 100644 --- a/src/Data/String.purs +++ b/src/Data/String.purs @@ -14,6 +14,7 @@ module Data.String singleton, localeCompare, replace, + count, take, takeWhile, drop, @@ -65,10 +66,10 @@ module Data.String uncons s = Just {head : U.charAt 0 s, tail : drop 1 s} takeWhile :: (Char -> Boolean) -> String -> String - takeWhile = doAfter take + takeWhile p s = take (count p s) s dropWhile :: (Char -> Boolean) -> String -> String - dropWhile = doAfter drop + dropWhile p s = drop (count p s) s foreign import fromCharArray """ @@ -162,18 +163,16 @@ module Data.String } """ :: Number -> String -> String - foreign import doAfter + foreign import count """ - function doAfter(f){ - return function(p){ - return function(s){ - var i; - for(i = 0; i < s.length && p(s.charAt(i)); i++){}; - return f(i)(s); - }; - }; + function count(p){ + return function(s){ + var i; + for(i = 0; i < s.length && p(s.charAt(i)); i++){}; + return i; + }; } - """ :: (Number -> String -> String) -> (Char -> Boolean) -> String -> String + """ :: (Char -> Boolean) -> String -> Number foreign import split """