137 lines
No EOL
3.5 KiB
JavaScript
137 lines
No EOL
3.5 KiB
JavaScript
|
|
var Data = function() {
|
|
|
|
var Char = function() {
|
|
return {fromCode : function(c) { return String.fromCharCode(c); },
|
|
toCode : function(c) { return c.charCodeAt(0); },
|
|
toUpper : function(c) { return c.toUpperCase(); },
|
|
toLower : function(c) { return c.toLowerCase(); },
|
|
toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },
|
|
toLocaleLower : function(c) { return c.toLocaleLowerCase(); }
|
|
};
|
|
}();
|
|
|
|
var Maybe = function() {
|
|
function consMaybe(x) { return function(xs) {
|
|
if (x[0] === "Just") return ["Cons", x[1], xs];
|
|
return xs;
|
|
};
|
|
}
|
|
function fromMaybe(b) { return function(m) {
|
|
if (m[0] === "Just") return m[1];
|
|
return b;
|
|
};
|
|
}
|
|
function mapCons(f) { return function(y) { return function(xs) {
|
|
var x = f(y);
|
|
if (x[0] === "Just") return ["Cons", x[1], xs];
|
|
return xs;
|
|
};
|
|
};
|
|
}
|
|
function maybe(b) { return function(f) { return function(m) {
|
|
if (m[0] === "Just") return f(m[1]);
|
|
return b;
|
|
};
|
|
};
|
|
}
|
|
|
|
return {Just : function(x) { return ["Just",x]; },
|
|
Nothing : ["Nothing"],
|
|
catMaybes : List.foldr(consMaybe)(["Nil"]),
|
|
isJust : function(m) { return m[0] === "Just"; },
|
|
isNothing : function(m) { return m[0] === "Nothing"; },
|
|
fromMaybe : fromMaybe,
|
|
consMaybe : consMaybe,
|
|
mapMaybe : function(f) { return List.foldr(mapCons(f))(["Nil"]); },
|
|
maybe : maybe
|
|
};
|
|
}();
|
|
|
|
var String = function() {
|
|
|
|
function append(s1) { return function(s2) {
|
|
return s1.concat(s2);
|
|
};
|
|
}
|
|
function map(f) { return function(s) {
|
|
for (var i = s.length; i--; ) { s[i] = f(s[i]); }
|
|
};
|
|
}
|
|
|
|
function intercalate(sep) { return function(ss) {
|
|
return Value.listToArray(ss).join(sep);
|
|
};
|
|
}
|
|
function intersperse(sep) { return function(s) {
|
|
return s.split("").join(sep);
|
|
};
|
|
}
|
|
|
|
function foldl(f) { return function(b) { return function(s) {
|
|
var acc = b;
|
|
for (var i = 0, len = s.length; i < len; ++i) { acc = f(s[i])(acc); }
|
|
return acc;
|
|
};
|
|
};
|
|
}
|
|
function foldr(f) { return function(b) { return function(s) {
|
|
var acc = b;
|
|
for (var i = s.length; i--; ) { acc = f(s[i])(acc); }
|
|
return acc;
|
|
};
|
|
};
|
|
}
|
|
|
|
function concatMap(f) { return function(s) {
|
|
var a = s.split("");
|
|
for (var i = a.length; i--; ) { a[i] = f(a[i]); }
|
|
return a.join("");
|
|
};
|
|
}
|
|
|
|
function forall(pred) { return function(s) {
|
|
for (var i = s.length; i--; ) { if (!pred(s[i])) {return false}; }
|
|
return true;
|
|
};
|
|
}
|
|
function exists(pred) { return function(s) {
|
|
for (var i = s.length; i--; ) { if (pred(s[i])) {return true}; }
|
|
return false;
|
|
};
|
|
}
|
|
|
|
return {cons : append,
|
|
snoc : append,
|
|
head : function(s) { return s[0]; },
|
|
last : function(s) { return s[s.length-1]; },
|
|
tail : function(s) { return s.slice(1); },
|
|
length : function(s) { return s.length; },
|
|
map : map,
|
|
intercalate : intercalate,
|
|
intersperse : intersperse,
|
|
reverse : function(s) { return s.split("").reverse().join(""); },
|
|
toLower : function(s) { return s.toLowerCase(); },
|
|
toUpper : function(s) { return s.toUpperCase(); },
|
|
foldl : foldl,
|
|
foldr : foldr,
|
|
concat : function(ss) { return Value.listToArray(ss).join(""); },
|
|
concatMap : concatMap,
|
|
forall : forall,
|
|
exists : exists,
|
|
/*
|
|
filter : filter,
|
|
take:,
|
|
drop:,
|
|
*/
|
|
toText : Value.toText,
|
|
properEscape : Value.properEscape
|
|
};
|
|
}();
|
|
|
|
return {String: {toText:Value.toText, properEscape:Value.properEscape},
|
|
Char:Char,
|
|
Maybe:Maybe,
|
|
List:List
|
|
};
|
|
}(); |