elm/libraries/Native/Prelude.js
evancz 7dbb052b22 Load json representation of types with Template Haskell, so library files are the base truth of type information.
Make minor fixes in libraries, such as adding the Char labrary and fixing the types in the Dict library.
2013-03-16 22:24:18 -07:00

126 lines
No EOL
2.8 KiB
JavaScript

Elm.Native.Prelude = function(elm) {
'use strict';
if (elm.Native.Prelude) return elm.Native.Prelude;
var JS = Elm.JavaScript(elm);
var Maybe = Elm.Maybe(elm);
var Utils = Elm.Native.Utils(elm);
var Char = Elm.Char(elm);
function div(a,b) { return (a/b)|0 }
function rem(a,b) { return a % b }
function mod(a,b) {
var r = a % b;
var m = a === 0 ? 0 : (b > 0 ? (a >= 0 ? r : r+b) : -mod(-a,-b));
return m === b ? 0 : m;
}
function abs(x) { return x < 0 ? -x : x }
function logBase(base,n) { return Math.log(n) / Math.log(base) }
function min(a,b) { return a < b ? a : b }
function max(a,b) { return a > b ? a : b }
function clamp(lo,hi,n) { return n < lo ? lo : n > hi ? hi : n }
function xor(a,b) { return a !== b }
function not(b) { return !b }
function truncate(n) { return n|0 }
function id(n) { return n }
function flip(f,a,b) { return A2(f,b,a) }
function curry(f,v) { return A2(f,v._0,v._1) }
function uncurry(f,a,b) { return f(Utils.Tuple2(a,b)) }
function fst(t) { return t._0 }
function snd(t) { return t._1 }
function readInt(str) {
var s = JS.fromString(str);
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));
}
function readFloat(str) {
var s = JS.fromString(str);
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));
}
var prelude = {
div:F2(div),
rem:F2(rem),
mod:F2(mod),
pi:Math.pi,
e:Math.e,
cos:Math.cos,
sin:Math.sin,
tan:Math.tan,
acos:Math.acos,
asin:Math.asin,
atan:Math.atan,
atan2:F2(Math.atan2),
sqrt:Math.sqrt,
abs:abs,
logBase:F2(logBase),
min:F2(min),
max:F2(max),
clamp:F3(clamp),
xor:F2(xor),
not:not,
otherwise:true,
truncate:truncate,
ceiling:Math.ceil,
floor:Math.floor,
round:Math.round,
toFloat:id,
readInt:readInt,
readFloat:readFloat,
id:id,
flip:F3(flip),
curry:F2(curry),
uncurry:F3(uncurry),
fst:fst,
snd:snd
};
function add(Module) {
var M = Module(elm);
for (var k in M) { prelude[k] = M[k] }
}
add(Elm.Signal);
add(Elm.List);
add(Elm.Maybe);
add(Elm.Time);
add(Elm.Graphics.Element);
return elm.Native.Prelude = prelude;
};