diff --git a/bower.json b/bower.json index f2dfc6d..5c38d67 100644 --- a/bower.json +++ b/bower.json @@ -5,7 +5,7 @@ "license": "MIT", "repository": { "type": "git", - "url": "git://github.com/purescript/purescript-strings.git" + "url": "git://github.com/lua-purescript/purescript-strings.git" }, "ignore": [ "**/.*", diff --git a/src/Data/Char.js b/src/Data/Char.js deleted file mode 100644 index 4c982b1..0000000 --- a/src/Data/Char.js +++ /dev/null @@ -1,20 +0,0 @@ -/* global exports */ -"use strict"; - -// module Data.Char - -exports.toCharCode = function (c) { - return c.charCodeAt(0); -}; - -exports.fromCharCode = function (c) { - return String.fromCharCode(c); -}; - -exports.toLower = function (c) { - return c.toLowerCase(); -}; - -exports.toUpper = function (c) { - return c.toUpperCase(); -}; diff --git a/src/Data/Char.lua b/src/Data/Char.lua new file mode 100644 index 0000000..fb77394 --- /dev/null +++ b/src/Data/Char.lua @@ -0,0 +1,20 @@ +-- module Data.Char +local Char = {} + +Char.toCharCode = function (c) + return string.byte(c) +end + +Char.fromCharCode = function (c) + return string.char(c) +end + +Char.toLower = function (c) + return string.lower(c) +end + +Char.toUpper = function (c) + return string.upper(c) +end + +return Char diff --git a/src/Data/String.js b/src/Data/String.js deleted file mode 100644 index e4a44ad..0000000 --- a/src/Data/String.js +++ /dev/null @@ -1,162 +0,0 @@ -/* global exports */ -"use strict"; - -// module Data.String - -exports._charAt = function (just) { - return function (nothing) { - return function (i) { - return function (s) { - return i >= 0 && i < s.length ? just(s.charAt(i)) : nothing; - }; - }; - }; -}; - -exports.singleton = function (c) { - return c; -}; - -exports._charCodeAt = function (just) { - return function (nothing) { - return function (i) { - return function (s) { - return i >= 0 && i < s.length ? just(s.charCodeAt(i)) : nothing; - }; - }; - }; -}; - -exports._toChar = function (just) { - return function (nothing) { - return function (s) { - return s.length === 1 ? just(s) : nothing; - }; - }; -}; - -exports.fromCharArray = function (a) { - return a.join(""); -}; - -exports._indexOf = function (just) { - return function (nothing) { - return function (x) { - return function (s) { - var i = s.indexOf(x); - return i === -1 ? nothing : just(i); - }; - }; - }; -}; - -exports["_indexOf'"] = function (just) { - return function (nothing) { - return function (x) { - return function (startAt) { - return function (s) { - if (startAt < 0 || startAt > s.length) return nothing; - var i = s.indexOf(x, startAt); - return i === -1 ? nothing : just(i); - }; - }; - }; - }; -}; - -exports._lastIndexOf = function (just) { - return function (nothing) { - return function (x) { - return function (s) { - var i = s.lastIndexOf(x); - return i === -1 ? nothing : just(i); - }; - }; - }; -}; - -exports["_lastIndexOf'"] = function (just) { - return function (nothing) { - return function (x) { - return function (startAt) { - return function (s) { - if (startAt < 0 || startAt > s.length) return nothing; - var i = s.lastIndexOf(x, startAt); - return i === -1 ? nothing : just(i); - }; - }; - }; - }; -}; - -exports.length = function (s) { - return s.length; -}; - -exports._localeCompare = function (lt) { - return function (eq) { - return function (gt) { - return function (s1) { - return function (s2) { - var result = s1.localeCompare(s2); - return result < 0 ? lt : result > 0 ? gt : eq; - }; - }; - }; - }; -}; - -exports.replace = function (s1) { - return function (s2) { - return function (s3) { - return s3.replace(s1, s2); - }; - }; -}; - -exports.take = function (n) { - return function (s) { - return s.substr(0, n); - }; -}; - -exports.drop = function (n) { - return function (s) { - return s.substring(n); - }; -}; - -exports.count = function (p) { - return function (s) { - for (var i = 0; i < s.length && p(s.charAt(i)); i++); {} - return i; - }; -}; - -exports.split = function (sep) { - return function (s) { - return s.split(sep); - }; -}; - -exports.toCharArray = function (s) { - return s.split(""); -}; - -exports.toLower = function (s) { - return s.toLowerCase(); -}; - -exports.toUpper = function (s) { - return s.toUpperCase(); -}; - -exports.trim = function (s) { - return s.trim(); -}; - -exports.joinWith = function (s) { - return function (xs) { - return xs.join(s); - }; -}; diff --git a/src/Data/String.lua b/src/Data/String.lua new file mode 100644 index 0000000..ccc95ff --- /dev/null +++ b/src/Data/String.lua @@ -0,0 +1,210 @@ +-- module Data.String +local String = {} + +String["_charAt"] = function (just) + return function (nothing) + return function (i) + return function (s) + return i >= 0 and i < #s and just(string.sub(s, i+1, i+1)) or nothing + end + end + end +end + +String.singleton = function(c) + return c +end + +String["_charCodeAt"] = function (just) + return function (nothing) + return function (i) + return function (s) + return i >= 0 and i < #s and just(byte(string.sub(s, i+1, i+1))) or nothing + end + end + end +end + +String["_toChar"] = function (just) + return function (nothing) + return function (s) + return #s == 1 and just(s) or nothing + end + end +end + +String.fromCharArray = function (a) + local result = "" + for i = 1, #a do + result = result .. a[i] + end + return result +end + +String["_indexOf"] = function (just) + return function (nothing) + return function (x) + return function (s) + local i = string.find(s, x) + return i == nil and nothing or just(i-1) + end + end + end +end + +String["_indexOf'"] = function (just) + return function (nothing) + return function (x) + return function (startAt) + return function (s) + if startAt < 0 or startAt > #s then return nothing end + local i = string.find(s, x, startAt+1) + return i == nil and nothing or just(i) + end + end + end + end +end + +String["_lastIndexOf"] = function (just) + return function (nothing) + return function (x) + return function (s) + local res = {string.find(s, x)} + local i = res[#res] + return i == nil and nothing or just(i) + end + end + end +end + +String["_lastIndexOf'"] = function (just) + return function (nothing) + return function (x) + return function (startAt) + return function (s) + if startAt < 0 or startAt > #s then return nothing end + local res = {string.find(s, x, startAt+1)} + local i = res[#res] + return i == nil and nothing or just(i) + end + end + end + end +end + +String.length = function (s) + return #s +end + +String["_localeCompare"] = function (lt) + return function (eq) + return function (gt) + return function (s1) + return function (s2) + if s1 == s2 then return eq end + if s1 < s2 then + return lt + else + return gt + end + end + end + end + end +end + +String.replace = function (pattern) + return function (replace) + return function (s) + return string.gsub(s, pattern, replace) + end + end +end + +String.take = function (n) + return function (s) + return s.substr(0, n) + return string.sub(s, 1, n) + end +end + +String.drop = function (n) + return function (s) + return string.sub(n+1) + end +end + +String.count = function (p) + return function (s) + local n = 0 + for i=1, #s do + if p(s[i]) then + n = n + 1 + else + return n + end + end + return n + end +end + +String.split = function (sep) + return function (s) + if sep == "" then + return String.toCharArray(s) + end + + local result = {} + local s_ = s + while s_ ~= "" do + local nextSep = string.find(s_, sep) + if not nextSep then + result[#result+1] = s_ + return result + end + + result[#result+1] = string.sub(s_, 1, nextSep-1) + s_ = string.sub(s_, nextSep+#sep) + while string.find(s_, sep) == 1 do + s_ = string.sub(s_, 2) + end + end + return result + end +end + +String.toCharArray = function (s) + local result = {} + for i = 1, #s do result[i] = string.sub(s, i, i) end + return result +end + +String.toLower = function (s) + return string.lower(s) +end + +String.toUpper = function (s) + return string.upper(s) +end + +String.trim = function (s) + local ltrim = string.gsub(s, "^%s*", "") + local rtrim = string.gsub(ltrim, "%s*$", "") + return rtrim +end + +String.joinWith = function (s) + return function (xs) + local result = "" + for i=1, #xs do + result = result .. xs[i] + if i ~= #xs then + result = result .. s + end + end + return result + end +end + +return String diff --git a/src/Data/String/Regex.js b/src/Data/String/Regex.js deleted file mode 100644 index 695303e..0000000 --- a/src/Data/String/Regex.js +++ /dev/null @@ -1,99 +0,0 @@ -/* global exports */ -"use strict"; - -// module Data.String.Regex - -exports["showRegex'"] = function (r) { - return "" + r; -}; - -exports["regex'"] = function (left) { - return function (right) { - return function (s1) { - return function (s2) { - try { - return right(new RegExp(s1, s2)); - } catch (e) { - return left(e.message); - } - }; - }; - }; -}; - -exports.source = function (r) { - return r.source; -}; - -exports.flags = function (r) { - return { - multiline: r.multiline, - ignoreCase: r.ignoreCase, - global: r.global, - sticky: !!r.sticky, - unicode: !!r.unicode - }; -}; - -exports.test = function (r) { - return function (s) { - var lastIndex = r.lastIndex; - var result = r.test(s); - r.lastIndex = lastIndex; - return result; - }; -}; - -exports._match = function (just) { - return function (nothing) { - return function (r) { - return function (s) { - var m = s.match(r); - if (m == null) { - return nothing; - } else { - var list = []; - for (var i = 0; i < m.length; i++) { - list.push(m[i] == null ? nothing : just(m[i])); - } - return just(list); - } - }; - }; - }; -}; - -exports.replace = function (r) { - return function (s1) { - return function (s2) { - return s2.replace(r, s1); - }; - }; -}; - -exports["replace'"] = function (r) { - return function (f) { - return function (s2) { - return s2.replace(r, function (match) { - return f(match)(Array.prototype.splice.call(arguments, 1, arguments.length - 3)); - }); - }; - }; -}; - -exports._search = function (just) { - return function (nothing) { - return function (r) { - return function (s) { - var result = s.search(r); - return result === -1 ? nothing : just(result); - }; - }; - }; -}; - -exports.split = function (r) { - return function (s) { - return s.split(r); - }; -}; diff --git a/src/Data/String/Regex.lua b/src/Data/String/Regex.lua new file mode 100644 index 0000000..f973b4c --- /dev/null +++ b/src/Data/String/Regex.lua @@ -0,0 +1,92 @@ +-- module Data.String.Regex +local Regex = {} + +error("Not implemented: Data.String.Regex") + +--[[ +Regex["showRegex'"] = function (r) + return "" + r +end + +Regex["regex'"] = function (s1) + return function (s2) + return new RegExp(s1, s2) + end +end + +Regex.source = function (r) + return r.source +end + +Regex.flags = function (r) + return { + multiline: r.multiline, + ignoreCase: r.ignoreCase, + global: r.global, + sticky: !!r.sticky, + unicode: !!r.unicode + end +end + +Regex.test = function (r) + return function (s) + return r.test(s) + end +end + +Regex._match = function (just) + return function (nothing) + return function (r) + return function (s) + var m = s.match(r) + if (m == null) { + return nothing + } else { + var list = [] + for (var i = 0; i < m.length; i++) { + list.push(m[i] == null ? nothing : just(m[i])) + } + return just(list) + } + end + end + end +end + +Regex.replace = function (r) + return function (s1) + return function (s2) + return s2.replace(r, s1) + end + end +end + +Regex["replace'"] = function (r) + return function (f) + return function (s2) + return s2.replace(r, function (match) + return f(match)(Array.prototype.splice.call(arguments, 1, arguments.length - 3)) + }) + end + end +end + +Regex._search = function (just) + return function (nothing) + return function (r) + return function (s) + var result = s.search(r) + return result === -1 ? nothing : just(result) + end + end + end +end + +Regex.split = function (r) + return function (s) + return s.split(r) + end +end + +return Regex +]] diff --git a/src/Data/String/Unsafe.js b/src/Data/String/Unsafe.js deleted file mode 100644 index 726fb29..0000000 --- a/src/Data/String/Unsafe.js +++ /dev/null @@ -1,23 +0,0 @@ -/* global exports */ -"use strict"; - -// module Data.String.Unsafe - -exports.charCodeAt = function (i) { - return function (s) { - if (i >= 0 && i < s.length) return s.charCodeAt(i); - throw new Error("Data.String.Unsafe.charCodeAt: Invalid index."); - }; -}; - -exports.charAt = function (i) { - return function (s) { - if (i >= 0 && i < s.length) return s.charAt(i); - throw new Error("Data.String.Unsafe.charAt: Invalid index."); - }; -}; - -exports.char = function (s) { - if (s.length === 1) return s.charAt(0); - throw new Error("Data.String.Unsafe.char: Expected string of length 1."); -}; diff --git a/src/Data/String/Unsafe.lua b/src/Data/String/Unsafe.lua new file mode 100644 index 0000000..4ed627c --- /dev/null +++ b/src/Data/String/Unsafe.lua @@ -0,0 +1,23 @@ +-- module Data.String.Unsafe +local Unsafe = {} + +Unsafe.charCodeAt = function (i) + return function (s) + if i >= 0 and i < #s then return byte(string.sub(s, i+1, i+1)) end + error("Data.String.Unsafe.charCodeAt: Invalid index.") + end +end + +Unsafe.charAt = function (i) + return function (s) + if i >= 0 and i < #s then return string.sub(s, i+1, i+1) end + error("Data.String.Unsafe.charAt: Invalid index.") + end +end + +Unsafe.char = function (s) + if s.length == 1 then return string.sub(s, 1, 1) end + error("Data.String.Unsafe.char: Expected string of length 1.") +end + +return Unsafe