elm/libraries/Native/String.js

252 lines
6.2 KiB
JavaScript

Elm.Native.String = {};
Elm.Native.String.make = function(elm) {
elm.Native = elm.Native || {};
elm.Native.String = elm.Native.String || {};
if (elm.Native.String.values) return elm.Native.String.values;
if ('values' in Elm.Native.String)
return elm.Native.String.values = Elm.Native.String.values;
var Char = Elm.Char.make(elm);
var Maybe = Elm.Maybe.make(elm);
var JS = Elm.JavaScript.make(elm);
var Utils = Elm.Native.Utils.make(elm);
function isEmpty(str) {
return str.length === 0;
}
function cons(chr,str) {
return chr + str;
}
function uncons(str) {
var hd;
return (hd = str[0]) ? Maybe.Just(Utils.Tuple2(Utils.chr(hd), str.slice(1)))
: Maybe.Nothing;
}
function append(a,b) {
return a + b;
}
function concat(strs) {
return JS.fromList(strs).join('');
}
function length(str) {
return str.length;
}
function map(f,str) {
var out = str.split('');
for (var i = out.length; i--; ) {
out[i] = f(Utils.chr(out[i]));
}
return out.join('');
}
function filter(pred,str) {
return str.split('').map(Utils.chr).filter(pred).join('');
}
function reverse(str) {
return str.split('').reverse().join('');
}
function foldl(f,b,str) {
var len = str.length;
for (var i = 0; i < len; ++i) {
b = A2(f, Utils.chr(str[i]), b);
}
return b;
}
function foldr(f,b,str) {
for (var i = str.length; i--; ) {
b = A2(f, Utils.chr(str[i]), b);
}
return b;
}
function split(sep, str) {
return JS.toList(str.split(sep));
}
function join(sep, strs) {
return JS.fromList(strs).join(sep);
}
function repeat(n, str) {
var result = '';
while (n > 0) {
if (n & 1) result += str;
n >>= 1, str += str;
}
return result;
}
function sub(start, end, str) {
return str.slice(start,end);
}
function left(n, str) {
return n < 1 ? "" : str.slice(0,n);
}
function right(n, str) {
return n < 1 ? "" : str.slice(-n);
}
function dropLeft(n, str) {
return n < 1 ? str : str.slice(n);
}
function dropRight(n, str) {
return n < 1 ? str : str.slice(0,-n);
}
function pad(n,chr,str) {
var half = (n - str.length) / 2;
return repeat(Math.ceil(half),chr) + str + repeat(half|0,chr);
}
function padRight(n,chr,str) {
return str + repeat(n - str.length, chr);
}
function padLeft(n,chr,str) {
return repeat(n - str.length, chr) + str;
}
function trim(str) {
return str.trim();
}
function trimLeft(str) {
return str.trimLeft();
}
function trimRight(str) {
return str.trimRight();
}
function words(str) {
return JS.toList(str.split(/\s+/g));
}
function lines(str) {
return JS.toList(str.split(/\r\n|\r|\n/g));
}
function toUpper(str) {
return str.toUpperCase();
}
function toLower(str) {
return str.toLowerCase();
}
function any(pred, str) {
for (var i = str.length; i--; ) {
if (pred(Utils.chr(str[i]))) return true;
}
return false;
}
function all(pred, str) {
for (var i = str.length; i--; ) {
if (!pred(Utils.chr(str[i]))) return false;
}
return true;
}
function contains(sub, str) {
return str.indexOf(sub) > -1;
}
function startsWith(sub, str) {
return str.indexOf(sub) === 0;
}
function endsWith(sub, str) {
return str.length >= sub.length &&
str.lastIndexOf(sub) === str.length - sub.length;
}
function indexes(sub, str) {
var subLen = sub.length;
var i = 0;
var is = [];
while ((i = str.indexOf(sub, i)) > -1) {
is.push(i);
i = i + subLen;
}
return JS.toList(is);
}
function toInt(s) {
var len = s.length;
if (len === 0) { return Maybe.Nothing; }
var start = 0;
if (s[0] == '-') {
if (len === 1) { return Maybe.Nothing; }
start = 1;
}
for (var i = start; i < len; ++i) {
if (!Char.isDigit(s[i])) { return Maybe.Nothing; }
}
return Maybe.Just(parseInt(s, 10));
}
function toFloat(s) {
var len = s.length;
if (len === 0) { return Maybe.Nothing; }
var start = 0;
if (s[0] == '-') {
if (len === 1) { return Maybe.Nothing; }
start = 1;
}
var dotCount = 0;
for (var i = start; i < len; ++i) {
if (Char.isDigit(s[i])) { continue; }
if (s[i] === '.') {
dotCount += 1;
if (dotCount <= 1) { continue; }
}
return Maybe.Nothing;
}
return Maybe.Just(parseFloat(s));
}
function toList(str) {
return JS.toList(str.split('').map(Utils.chr));
}
function fromList(chars) {
return JS.fromList(chars).join('');
}
return Elm.Native.String.values = {
isEmpty: isEmpty,
cons: F2(cons),
uncons: uncons,
append: F2(append),
concat: concat,
length: length,
map: F2(map),
filter: F2(filter),
reverse: reverse,
foldl: F3(foldl),
foldr: F3(foldr),
split: F2(split),
join: F2(join),
repeat: F2(repeat),
sub: F3(sub),
left: F2(left),
right: F2(right),
dropLeft: F2(dropLeft),
dropRight: F2(dropRight),
pad: F3(pad),
padLeft: F3(padLeft),
padRight: F3(padRight),
trim: trim,
trimLeft: trimLeft,
trimRight: trimRight,
words: words,
lines: lines,
toUpper: toUpper,
toLower: toLower,
any: F2(any),
all: F2(all),
contains: F2(contains),
startsWith: F2(startsWith),
endsWith: F2(endsWith),
indexes: F2(indexes),
toInt: toInt,
toFloat: toFloat,
toList: toList,
fromList: fromList,
};
};