| |
| (function() { |
| 'use strict'; |
| |
| function F2(fun) |
| { |
| function wrapper(a) { return function(b) { return fun(a,b); }; } |
| wrapper.arity = 2; |
| wrapper.func = fun; |
| return wrapper; |
| } |
| |
| function F3(fun) |
| { |
| function wrapper(a) { |
| return function(b) { return function(c) { return fun(a, b, c); }; }; |
| } |
| wrapper.arity = 3; |
| wrapper.func = fun; |
| return wrapper; |
| } |
| |
| function F4(fun) |
| { |
| function wrapper(a) { return function(b) { return function(c) { |
| return function(d) { return fun(a, b, c, d); }; }; }; |
| } |
| wrapper.arity = 4; |
| wrapper.func = fun; |
| return wrapper; |
| } |
| |
| function F5(fun) |
| { |
| function wrapper(a) { return function(b) { return function(c) { |
| return function(d) { return function(e) { return fun(a, b, c, d, e); }; }; }; }; |
| } |
| wrapper.arity = 5; |
| wrapper.func = fun; |
| return wrapper; |
| } |
| |
| function F6(fun) |
| { |
| function wrapper(a) { return function(b) { return function(c) { |
| return function(d) { return function(e) { return function(f) { |
| return fun(a, b, c, d, e, f); }; }; }; }; }; |
| } |
| wrapper.arity = 6; |
| wrapper.func = fun; |
| return wrapper; |
| } |
| |
| function F7(fun) |
| { |
| function wrapper(a) { return function(b) { return function(c) { |
| return function(d) { return function(e) { return function(f) { |
| return function(g) { return fun(a, b, c, d, e, f, g); }; }; }; }; }; }; |
| } |
| wrapper.arity = 7; |
| wrapper.func = fun; |
| return wrapper; |
| } |
| |
| function F8(fun) |
| { |
| function wrapper(a) { return function(b) { return function(c) { |
| return function(d) { return function(e) { return function(f) { |
| return function(g) { return function(h) { |
| return fun(a, b, c, d, e, f, g, h); }; }; }; }; }; }; }; |
| } |
| wrapper.arity = 8; |
| wrapper.func = fun; |
| return wrapper; |
| } |
| |
| function F9(fun) |
| { |
| function wrapper(a) { return function(b) { return function(c) { |
| return function(d) { return function(e) { return function(f) { |
| return function(g) { return function(h) { return function(i) { |
| return fun(a, b, c, d, e, f, g, h, i); }; }; }; }; }; }; }; }; |
| } |
| wrapper.arity = 9; |
| wrapper.func = fun; |
| return wrapper; |
| } |
| |
| function A2(fun, a, b) |
| { |
| return fun.arity === 2 |
| ? fun.func(a, b) |
| : fun(a)(b); |
| } |
| function A3(fun, a, b, c) |
| { |
| return fun.arity === 3 |
| ? fun.func(a, b, c) |
| : fun(a)(b)(c); |
| } |
| function A4(fun, a, b, c, d) |
| { |
| return fun.arity === 4 |
| ? fun.func(a, b, c, d) |
| : fun(a)(b)(c)(d); |
| } |
| function A5(fun, a, b, c, d, e) |
| { |
| return fun.arity === 5 |
| ? fun.func(a, b, c, d, e) |
| : fun(a)(b)(c)(d)(e); |
| } |
| function A6(fun, a, b, c, d, e, f) |
| { |
| return fun.arity === 6 |
| ? fun.func(a, b, c, d, e, f) |
| : fun(a)(b)(c)(d)(e)(f); |
| } |
| function A7(fun, a, b, c, d, e, f, g) |
| { |
| return fun.arity === 7 |
| ? fun.func(a, b, c, d, e, f, g) |
| : fun(a)(b)(c)(d)(e)(f)(g); |
| } |
| function A8(fun, a, b, c, d, e, f, g, h) |
| { |
| return fun.arity === 8 |
| ? fun.func(a, b, c, d, e, f, g, h) |
| : fun(a)(b)(c)(d)(e)(f)(g)(h); |
| } |
| function A9(fun, a, b, c, d, e, f, g, h, i) |
| { |
| return fun.arity === 9 |
| ? fun.func(a, b, c, d, e, f, g, h, i) |
| : fun(a)(b)(c)(d)(e)(f)(g)(h)(i); |
| } |
| |
| //import Native.Utils // |
| |
| var _elm_lang$core$Native_Basics = function() { |
| |
| function div(a, b) |
| { |
| return (a / b) | 0; |
| } |
| function rem(a, b) |
| { |
| return a % b; |
| } |
| function mod(a, b) |
| { |
| if (b === 0) |
| { |
| throw new Error('Cannot perform mod 0. Division by zero error.'); |
| } |
| 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 logBase(base, n) |
| { |
| return Math.log(n) / Math.log(base); |
| } |
| function negate(n) |
| { |
| return -n; |
| } |
| function abs(n) |
| { |
| return n < 0 ? -n : n; |
| } |
| |
| function min(a, b) |
| { |
| return _elm_lang$core$Native_Utils.cmp(a, b) < 0 ? a : b; |
| } |
| function max(a, b) |
| { |
| return _elm_lang$core$Native_Utils.cmp(a, b) > 0 ? a : b; |
| } |
| function clamp(lo, hi, n) |
| { |
| return _elm_lang$core$Native_Utils.cmp(n, lo) < 0 |
| ? lo |
| : _elm_lang$core$Native_Utils.cmp(n, hi) > 0 |
| ? hi |
| : n; |
| } |
| |
| var ord = ['LT', 'EQ', 'GT']; |
| |
| function compare(x, y) |
| { |
| return { ctor: ord[_elm_lang$core$Native_Utils.cmp(x, y) + 1] }; |
| } |
| |
| function xor(a, b) |
| { |
| return a !== b; |
| } |
| function not(b) |
| { |
| return !b; |
| } |
| function isInfinite(n) |
| { |
| return n === Infinity || n === -Infinity; |
| } |
| |
| function truncate(n) |
| { |
| return n | 0; |
| } |
| |
| function degrees(d) |
| { |
| return d * Math.PI / 180; |
| } |
| function turns(t) |
| { |
| return 2 * Math.PI * t; |
| } |
| function fromPolar(point) |
| { |
| var r = point._0; |
| var t = point._1; |
| return _elm_lang$core$Native_Utils.Tuple2(r * Math.cos(t), r * Math.sin(t)); |
| } |
| function toPolar(point) |
| { |
| var x = point._0; |
| var y = point._1; |
| return _elm_lang$core$Native_Utils.Tuple2(Math.sqrt(x * x + y * y), Math.atan2(y, x)); |
| } |
| |
| return { |
| 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), |
| |
| degrees: degrees, |
| turns: turns, |
| fromPolar: fromPolar, |
| toPolar: toPolar, |
| |
| sqrt: Math.sqrt, |
| logBase: F2(logBase), |
| negate: negate, |
| abs: abs, |
| min: F2(min), |
| max: F2(max), |
| clamp: F3(clamp), |
| compare: F2(compare), |
| |
| xor: F2(xor), |
| not: not, |
| |
| truncate: truncate, |
| ceiling: Math.ceil, |
| floor: Math.floor, |
| round: Math.round, |
| toFloat: function(x) { return x; }, |
| isNaN: isNaN, |
| isInfinite: isInfinite |
| }; |
| |
| }(); |
| //import // |
| |
| var _elm_lang$core$Native_Utils = function() { |
| |
| // COMPARISONS |
| |
| function eq(x, y) |
| { |
| var stack = []; |
| var isEqual = eqHelp(x, y, 0, stack); |
| var pair; |
| while (isEqual && (pair = stack.pop())) |
| { |
| isEqual = eqHelp(pair.x, pair.y, 0, stack); |
| } |
| return isEqual; |
| } |
| |
| |
| function eqHelp(x, y, depth, stack) |
| { |
| if (depth > 100) |
| { |
| stack.push({ x: x, y: y }); |
| return true; |
| } |
| |
| if (x === y) |
| { |
| return true; |
| } |
| |
| if (typeof x !== 'object') |
| { |
| if (typeof x === 'function') |
| { |
| throw new Error( |
| 'Trying to use `(==)` on functions. There is no way to know if functions are "the same" in the Elm sense.' |
| + ' Read more about this at http://package.elm-lang.org/packages/elm-lang/core/latest/Basics#==' |
| + ' which describes why it is this way and what the better version will look like.' |
| ); |
| } |
| return false; |
| } |
| |
| if (x === null || y === null) |
| { |
| return false |
| } |
| |
| if (x instanceof Date) |
| { |
| return x.getTime() === y.getTime(); |
| } |
| |
| if (!('ctor' in x)) |
| { |
| for (var key in x) |
| { |
| if (!eqHelp(x[key], y[key], depth + 1, stack)) |
| { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| // convert Dicts and Sets to lists |
| if (x.ctor === 'RBNode_elm_builtin' || x.ctor === 'RBEmpty_elm_builtin') |
| { |
| x = _elm_lang$core$Dict$toList(x); |
| y = _elm_lang$core$Dict$toList(y); |
| } |
| if (x.ctor === 'Set_elm_builtin') |
| { |
| x = _elm_lang$core$Set$toList(x); |
| y = _elm_lang$core$Set$toList(y); |
| } |
| |
| // check if lists are equal without recursion |
| if (x.ctor === '::') |
| { |
| var a = x; |
| var b = y; |
| while (a.ctor === '::' && b.ctor === '::') |
| { |
| if (!eqHelp(a._0, b._0, depth + 1, stack)) |
| { |
| return false; |
| } |
| a = a._1; |
| b = b._1; |
| } |
| return a.ctor === b.ctor; |
| } |
| |
| // check if Arrays are equal |
| if (x.ctor === '_Array') |
| { |
| var xs = _elm_lang$core$Native_Array.toJSArray(x); |
| var ys = _elm_lang$core$Native_Array.toJSArray(y); |
| if (xs.length !== ys.length) |
| { |
| return false; |
| } |
| for (var i = 0; i < xs.length; i++) |
| { |
| if (!eqHelp(xs[i], ys[i], depth + 1, stack)) |
| { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| if (!eqHelp(x.ctor, y.ctor, depth + 1, stack)) |
| { |
| return false; |
| } |
| |
| for (var key in x) |
| { |
| if (!eqHelp(x[key], y[key], depth + 1, stack)) |
| { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| // Code in Generate/JavaScript.hs, Basics.js, and List.js depends on |
| // the particular integer values assigned to LT, EQ, and GT. |
| |
| var LT = -1, EQ = 0, GT = 1; |
| |
| function cmp(x, y) |
| { |
| if (typeof x !== 'object') |
| { |
| return x === y ? EQ : x < y ? LT : GT; |
| } |
| |
| if (x instanceof String) |
| { |
| var a = x.valueOf(); |
| var b = y.valueOf(); |
| return a === b ? EQ : a < b ? LT : GT; |
| } |
| |
| if (x.ctor === '::' || x.ctor === '[]') |
| { |
| while (x.ctor === '::' && y.ctor === '::') |
| { |
| var ord = cmp(x._0, y._0); |
| if (ord !== EQ) |
| { |
| return ord; |
| } |
| x = x._1; |
| y = y._1; |
| } |
| return x.ctor === y.ctor ? EQ : x.ctor === '[]' ? LT : GT; |
| } |
| |
| if (x.ctor.slice(0, 6) === '_Tuple') |
| { |
| var ord; |
| var n = x.ctor.slice(6) - 0; |
| var err = 'cannot compare tuples with more than 6 elements.'; |
| if (n === 0) return EQ; |
| if (n >= 1) { ord = cmp(x._0, y._0); if (ord !== EQ) return ord; |
| if (n >= 2) { ord = cmp(x._1, y._1); if (ord !== EQ) return ord; |
| if (n >= 3) { ord = cmp(x._2, y._2); if (ord !== EQ) return ord; |
| if (n >= 4) { ord = cmp(x._3, y._3); if (ord !== EQ) return ord; |
| if (n >= 5) { ord = cmp(x._4, y._4); if (ord !== EQ) return ord; |
| if (n >= 6) { ord = cmp(x._5, y._5); if (ord !== EQ) return ord; |
| if (n >= 7) throw new Error('Comparison error: ' + err); } } } } } } |
| return EQ; |
| } |
| |
| throw new Error( |
| 'Comparison error: comparison is only defined on ints, ' |
| + 'floats, times, chars, strings, lists of comparable values, ' |
| + 'and tuples of comparable values.' |
| ); |
| } |
| |
| |
| // COMMON VALUES |
| |
| var Tuple0 = { |
| ctor: '_Tuple0' |
| }; |
| |
| function Tuple2(x, y) |
| { |
| return { |
| ctor: '_Tuple2', |
| _0: x, |
| _1: y |
| }; |
| } |
| |
| function chr(c) |
| { |
| return new String(c); |
| } |
| |
| |
| // GUID |
| |
| var count = 0; |
| function guid(_) |
| { |
| return count++; |
| } |
| |
| |
| // RECORDS |
| |
| function update(oldRecord, updatedFields) |
| { |
| var newRecord = {}; |
| for (var key in oldRecord) |
| { |
| var value = (key in updatedFields) ? updatedFields[key] : oldRecord[key]; |
| newRecord[key] = value; |
| } |
| return newRecord; |
| } |
| |
| |
| //// LIST STUFF //// |
| |
| var Nil = { ctor: '[]' }; |
| |
| function Cons(hd, tl) |
| { |
| return { |
| ctor: '::', |
| _0: hd, |
| _1: tl |
| }; |
| } |
| |
| function append(xs, ys) |
| { |
| // append Strings |
| if (typeof xs === 'string') |
| { |
| return xs + ys; |
| } |
| |
| // append Lists |
| if (xs.ctor === '[]') |
| { |
| return ys; |
| } |
| var root = Cons(xs._0, Nil); |
| var curr = root; |
| xs = xs._1; |
| while (xs.ctor !== '[]') |
| { |
| curr._1 = Cons(xs._0, Nil); |
| xs = xs._1; |
| curr = curr._1; |
| } |
| curr._1 = ys; |
| return root; |
| } |
| |
| |
| // CRASHES |
| |
| function crash(moduleName, region) |
| { |
| return function(message) { |
| throw new Error( |
| 'Ran into a `Debug.crash` in module `' + moduleName + '` ' + regionToString(region) + '\n' |
| + 'The message provided by the code author is:\n\n ' |
| + message |
| ); |
| }; |
| } |
| |
| function crashCase(moduleName, region, value) |
| { |
| return function(message) { |
| throw new Error( |
| 'Ran into a `Debug.crash` in module `' + moduleName + '`\n\n' |
| + 'This was caused by the `case` expression ' + regionToString(region) + '.\n' |
| + 'One of the branches ended with a crash and the following value got through:\n\n ' + toString(value) + '\n\n' |
| + 'The message provided by the code author is:\n\n ' |
| + message |
| ); |
| }; |
| } |
| |
| function regionToString(region) |
| { |
| if (region.start.line == region.end.line) |
| { |
| return 'on line ' + region.start.line; |
| } |
| return 'between lines ' + region.start.line + ' and ' + region.end.line; |
| } |
| |
| |
| // TO STRING |
| |
| function toString(v) |
| { |
| var type = typeof v; |
| if (type === 'function') |
| { |
| var name = v.func ? v.func.name : v.name; |
| return '<function' + (name === '' ? '' : ':') + name + '>'; |
| } |
| |
| if (type === 'boolean') |
| { |
| return v ? 'True' : 'False'; |
| } |
| |
| if (type === 'number') |
| { |
| return v + ''; |
| } |
| |
| if (v instanceof String) |
| { |
| return '\'' + addSlashes(v, true) + '\''; |
| } |
| |
| if (type === 'string') |
| { |
| return '"' + addSlashes(v, false) + '"'; |
| } |
| |
| if (v === null) |
| { |
| return 'null'; |
| } |
| |
| if (type === 'object' && 'ctor' in v) |
| { |
| var ctorStarter = v.ctor.substring(0, 5); |
| |
| if (ctorStarter === '_Tupl') |
| { |
| var output = []; |
| for (var k in v) |
| { |
| if (k === 'ctor') continue; |
| output.push(toString(v[k])); |
| } |
| return '(' + output.join(',') + ')'; |
| } |
| |
| if (ctorStarter === '_Task') |
| { |
| return '<task>' |
| } |
| |
| if (v.ctor === '_Array') |
| { |
| var list = _elm_lang$core$Array$toList(v); |
| return 'Array.fromList ' + toString(list); |
| } |
| |
| if (v.ctor === '<decoder>') |
| { |
| return '<decoder>'; |
| } |
| |
| if (v.ctor === '_Process') |
| { |
| return '<process:' + v.id + '>'; |
| } |
| |
| if (v.ctor === '::') |
| { |
| var output = '[' + toString(v._0); |
| v = v._1; |
| while (v.ctor === '::') |
| { |
| output += ',' + toString(v._0); |
| v = v._1; |
| } |
| return output + ']'; |
| } |
| |
| if (v.ctor === '[]') |
| { |
| return '[]'; |
| } |
| |
| if (v.ctor === 'Set_elm_builtin') |
| { |
| return 'Set.fromList ' + toString(_elm_lang$core$Set$toList(v)); |
| } |
| |
| if (v.ctor === 'RBNode_elm_builtin' || v.ctor === 'RBEmpty_elm_builtin') |
| { |
| return 'Dict.fromList ' + toString(_elm_lang$core$Dict$toList(v)); |
| } |
| |
| var output = ''; |
| for (var i in v) |
| { |
| if (i === 'ctor') continue; |
| var str = toString(v[i]); |
| var c0 = str[0]; |
| var parenless = c0 === '{' || c0 === '(' || c0 === '<' || c0 === '"' || str.indexOf(' ') < 0; |
| output += ' ' + (parenless ? str : '(' + str + ')'); |
| } |
| return v.ctor + output; |
| } |
| |
| if (type === 'object') |
| { |
| if (v instanceof Date) |
| { |
| return '<' + v.toString() + '>'; |
| } |
| |
| if (v.elm_web_socket) |
| { |
| return '<websocket>'; |
| } |
| |
| var output = []; |
| for (var k in v) |
| { |
| output.push(k + ' = ' + toString(v[k])); |
| } |
| if (output.length === 0) |
| { |
| return '{}'; |
| } |
| return '{ ' + output.join(', ') + ' }'; |
| } |
| |
| return '<internal structure>'; |
| } |
| |
| function addSlashes(str, isChar) |
| { |
| var s = str.replace(/\\/g, '\\\\') |
| .replace(/\n/g, '\\n') |
| .replace(/\t/g, '\\t') |
| .replace(/\r/g, '\\r') |
| .replace(/\v/g, '\\v') |
| .replace(/\0/g, '\\0'); |
| if (isChar) |
| { |
| return s.replace(/\'/g, '\\\''); |
| } |
| else |
| { |
| return s.replace(/\"/g, '\\"'); |
| } |
| } |
| |
| |
| return { |
| eq: eq, |
| cmp: cmp, |
| Tuple0: Tuple0, |
| Tuple2: Tuple2, |
| chr: chr, |
| update: update, |
| guid: guid, |
| |
| append: F2(append), |
| |
| crash: crash, |
| crashCase: crashCase, |
| |
| toString: toString |
| }; |
| |
| }(); |
| var _elm_lang$core$Basics$uncurry = F2( |
| function (f, _p0) { |
| var _p1 = _p0; |
| return A2(f, _p1._0, _p1._1); |
| }); |
| var _elm_lang$core$Basics$curry = F3( |
| function (f, a, b) { |
| return f( |
| {ctor: '_Tuple2', _0: a, _1: b}); |
| }); |
| var _elm_lang$core$Basics$flip = F3( |
| function (f, b, a) { |
| return A2(f, a, b); |
| }); |
| var _elm_lang$core$Basics$snd = function (_p2) { |
| var _p3 = _p2; |
| return _p3._1; |
| }; |
| var _elm_lang$core$Basics$fst = function (_p4) { |
| var _p5 = _p4; |
| return _p5._0; |
| }; |
| var _elm_lang$core$Basics$always = F2( |
| function (a, _p6) { |
| return a; |
| }); |
| var _elm_lang$core$Basics$identity = function (x) { |
| return x; |
| }; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['<|'] = F2( |
| function (f, x) { |
| return f(x); |
| }); |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['|>'] = F2( |
| function (x, f) { |
| return f(x); |
| }); |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['>>'] = F3( |
| function (f, g, x) { |
| return g( |
| f(x)); |
| }); |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['<<'] = F3( |
| function (g, f, x) { |
| return g( |
| f(x)); |
| }); |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['++'] = _elm_lang$core$Native_Utils.append; |
| var _elm_lang$core$Basics$toString = _elm_lang$core$Native_Utils.toString; |
| var _elm_lang$core$Basics$isInfinite = _elm_lang$core$Native_Basics.isInfinite; |
| var _elm_lang$core$Basics$isNaN = _elm_lang$core$Native_Basics.isNaN; |
| var _elm_lang$core$Basics$toFloat = _elm_lang$core$Native_Basics.toFloat; |
| var _elm_lang$core$Basics$ceiling = _elm_lang$core$Native_Basics.ceiling; |
| var _elm_lang$core$Basics$floor = _elm_lang$core$Native_Basics.floor; |
| var _elm_lang$core$Basics$truncate = _elm_lang$core$Native_Basics.truncate; |
| var _elm_lang$core$Basics$round = _elm_lang$core$Native_Basics.round; |
| var _elm_lang$core$Basics$not = _elm_lang$core$Native_Basics.not; |
| var _elm_lang$core$Basics$xor = _elm_lang$core$Native_Basics.xor; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['||'] = _elm_lang$core$Native_Basics.or; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['&&'] = _elm_lang$core$Native_Basics.and; |
| var _elm_lang$core$Basics$max = _elm_lang$core$Native_Basics.max; |
| var _elm_lang$core$Basics$min = _elm_lang$core$Native_Basics.min; |
| var _elm_lang$core$Basics$compare = _elm_lang$core$Native_Basics.compare; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['>='] = _elm_lang$core$Native_Basics.ge; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['<='] = _elm_lang$core$Native_Basics.le; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['>'] = _elm_lang$core$Native_Basics.gt; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['<'] = _elm_lang$core$Native_Basics.lt; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['/='] = _elm_lang$core$Native_Basics.neq; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['=='] = _elm_lang$core$Native_Basics.eq; |
| var _elm_lang$core$Basics$e = _elm_lang$core$Native_Basics.e; |
| var _elm_lang$core$Basics$pi = _elm_lang$core$Native_Basics.pi; |
| var _elm_lang$core$Basics$clamp = _elm_lang$core$Native_Basics.clamp; |
| var _elm_lang$core$Basics$logBase = _elm_lang$core$Native_Basics.logBase; |
| var _elm_lang$core$Basics$abs = _elm_lang$core$Native_Basics.abs; |
| var _elm_lang$core$Basics$negate = _elm_lang$core$Native_Basics.negate; |
| var _elm_lang$core$Basics$sqrt = _elm_lang$core$Native_Basics.sqrt; |
| var _elm_lang$core$Basics$atan2 = _elm_lang$core$Native_Basics.atan2; |
| var _elm_lang$core$Basics$atan = _elm_lang$core$Native_Basics.atan; |
| var _elm_lang$core$Basics$asin = _elm_lang$core$Native_Basics.asin; |
| var _elm_lang$core$Basics$acos = _elm_lang$core$Native_Basics.acos; |
| var _elm_lang$core$Basics$tan = _elm_lang$core$Native_Basics.tan; |
| var _elm_lang$core$Basics$sin = _elm_lang$core$Native_Basics.sin; |
| var _elm_lang$core$Basics$cos = _elm_lang$core$Native_Basics.cos; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['^'] = _elm_lang$core$Native_Basics.exp; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['%'] = _elm_lang$core$Native_Basics.mod; |
| var _elm_lang$core$Basics$rem = _elm_lang$core$Native_Basics.rem; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['//'] = _elm_lang$core$Native_Basics.div; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['/'] = _elm_lang$core$Native_Basics.floatDiv; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['*'] = _elm_lang$core$Native_Basics.mul; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['-'] = _elm_lang$core$Native_Basics.sub; |
| var _elm_lang$core$Basics_ops = _elm_lang$core$Basics_ops || {}; |
| _elm_lang$core$Basics_ops['+'] = _elm_lang$core$Native_Basics.add; |
| var _elm_lang$core$Basics$toPolar = _elm_lang$core$Native_Basics.toPolar; |
| var _elm_lang$core$Basics$fromPolar = _elm_lang$core$Native_Basics.fromPolar; |
| var _elm_lang$core$Basics$turns = _elm_lang$core$Native_Basics.turns; |
| var _elm_lang$core$Basics$degrees = _elm_lang$core$Native_Basics.degrees; |
| var _elm_lang$core$Basics$radians = function (t) { |
| return t; |
| }; |
| var _elm_lang$core$Basics$GT = {ctor: 'GT'}; |
| var _elm_lang$core$Basics$EQ = {ctor: 'EQ'}; |
| var _elm_lang$core$Basics$LT = {ctor: 'LT'}; |
| var _elm_lang$core$Basics$Never = function (a) { |
| return {ctor: 'Never', _0: a}; |
| }; |
| |
| //import Native.Utils // |
| |
| var _elm_lang$core$Native_Debug = function() { |
| |
| function log(tag, value) |
| { |
| var msg = tag + ': ' + _elm_lang$core$Native_Utils.toString(value); |
| var process = process || {}; |
| if (process.stdout) |
| { |
| process.stdout.write(msg); |
| } |
| else |
| { |
| // console.log(msg); |
| } |
| return value; |
| } |
| |
| function crash(message) |
| { |
| throw new Error(message); |
| } |
| |
| return { |
| crash: crash, |
| log: F2(log) |
| }; |
| |
| }(); |
| var _elm_lang$core$Debug$crash = _elm_lang$core$Native_Debug.crash; |
| var _elm_lang$core$Debug$log = _elm_lang$core$Native_Debug.log; |
| |
| var _elm_lang$core$Maybe$withDefault = F2( |
| function ($default, maybe) { |
| var _p0 = maybe; |
| if (_p0.ctor === 'Just') { |
| return _p0._0; |
| } else { |
| return $default; |
| } |
| }); |
| var _elm_lang$core$Maybe$Nothing = {ctor: 'Nothing'}; |
| var _elm_lang$core$Maybe$oneOf = function (maybes) { |
| oneOf: |
| while (true) { |
| var _p1 = maybes; |
| if (_p1.ctor === '[]') { |
| return _elm_lang$core$Maybe$Nothing; |
| } else { |
| var _p3 = _p1._0; |
| var _p2 = _p3; |
| if (_p2.ctor === 'Nothing') { |
| var _v3 = _p1._1; |
| maybes = _v3; |
| continue oneOf; |
| } else { |
| return _p3; |
| } |
| } |
| } |
| }; |
| var _elm_lang$core$Maybe$andThen = F2( |
| function (maybeValue, callback) { |
| var _p4 = maybeValue; |
| if (_p4.ctor === 'Just') { |
| return callback(_p4._0); |
| } else { |
| return _elm_lang$core$Maybe$Nothing; |
| } |
| }); |
| var _elm_lang$core$Maybe$Just = function (a) { |
| return {ctor: 'Just', _0: a}; |
| }; |
| var _elm_lang$core$Maybe$map = F2( |
| function (f, maybe) { |
| var _p5 = maybe; |
| if (_p5.ctor === 'Just') { |
| return _elm_lang$core$Maybe$Just( |
| f(_p5._0)); |
| } else { |
| return _elm_lang$core$Maybe$Nothing; |
| } |
| }); |
| var _elm_lang$core$Maybe$map2 = F3( |
| function (func, ma, mb) { |
| var _p6 = {ctor: '_Tuple2', _0: ma, _1: mb}; |
| if (((_p6.ctor === '_Tuple2') && (_p6._0.ctor === 'Just')) && (_p6._1.ctor === 'Just')) { |
| return _elm_lang$core$Maybe$Just( |
| A2(func, _p6._0._0, _p6._1._0)); |
| } else { |
| return _elm_lang$core$Maybe$Nothing; |
| } |
| }); |
| var _elm_lang$core$Maybe$map3 = F4( |
| function (func, ma, mb, mc) { |
| var _p7 = {ctor: '_Tuple3', _0: ma, _1: mb, _2: mc}; |
| if ((((_p7.ctor === '_Tuple3') && (_p7._0.ctor === 'Just')) && (_p7._1.ctor === 'Just')) && (_p7._2.ctor === 'Just')) { |
| return _elm_lang$core$Maybe$Just( |
| A3(func, _p7._0._0, _p7._1._0, _p7._2._0)); |
| } else { |
| return _elm_lang$core$Maybe$Nothing; |
| } |
| }); |
| var _elm_lang$core$Maybe$map4 = F5( |
| function (func, ma, mb, mc, md) { |
| var _p8 = {ctor: '_Tuple4', _0: ma, _1: mb, _2: mc, _3: md}; |
| if (((((_p8.ctor === '_Tuple4') && (_p8._0.ctor === 'Just')) && (_p8._1.ctor === 'Just')) && (_p8._2.ctor === 'Just')) && (_p8._3.ctor === 'Just')) { |
| return _elm_lang$core$Maybe$Just( |
| A4(func, _p8._0._0, _p8._1._0, _p8._2._0, _p8._3._0)); |
| } else { |
| return _elm_lang$core$Maybe$Nothing; |
| } |
| }); |
| var _elm_lang$core$Maybe$map5 = F6( |
| function (func, ma, mb, mc, md, me) { |
| var _p9 = {ctor: '_Tuple5', _0: ma, _1: mb, _2: mc, _3: md, _4: me}; |
| if ((((((_p9.ctor === '_Tuple5') && (_p9._0.ctor === 'Just')) && (_p9._1.ctor === 'Just')) && (_p9._2.ctor === 'Just')) && (_p9._3.ctor === 'Just')) && (_p9._4.ctor === 'Just')) { |
| return _elm_lang$core$Maybe$Just( |
| A5(func, _p9._0._0, _p9._1._0, _p9._2._0, _p9._3._0, _p9._4._0)); |
| } else { |
| return _elm_lang$core$Maybe$Nothing; |
| } |
| }); |
| |
| //import Native.Utils // |
| |
| var _elm_lang$core$Native_List = function() { |
| |
| var Nil = { ctor: '[]' }; |
| |
| function Cons(hd, tl) |
| { |
| return { ctor: '::', _0: hd, _1: tl }; |
| } |
| |
| function fromArray(arr) |
| { |
| var out = Nil; |
| for (var i = arr.length; i--; ) |
| { |
| out = Cons(arr[i], out); |
| } |
| return out; |
| } |
| |
| function toArray(xs) |
| { |
| var out = []; |
| while (xs.ctor !== '[]') |
| { |
| out.push(xs._0); |
| xs = xs._1; |
| } |
| return out; |
| } |
| |
| |
| function range(lo, hi) |
| { |
| var list = Nil; |
| if (lo <= hi) |
| { |
| do |
| { |
| list = Cons(hi, list); |
| } |
| while (hi-- > lo); |
| } |
| return list; |
| } |
| |
| function foldr(f, b, xs) |
| { |
| var arr = toArray(xs); |
| var acc = b; |
| for (var i = arr.length; i--; ) |
| { |
| acc = A2(f, arr[i], acc); |
| } |
| return acc; |
| } |
| |
| function map2(f, xs, ys) |
| { |
| var arr = []; |
| while (xs.ctor !== '[]' && ys.ctor !== '[]') |
| { |
| arr.push(A2(f, xs._0, ys._0)); |
| xs = xs._1; |
| ys = ys._1; |
| } |
| return fromArray(arr); |
| } |
| |
| function map3(f, xs, ys, zs) |
| { |
| var arr = []; |
| while (xs.ctor !== '[]' && ys.ctor !== '[]' && zs.ctor !== '[]') |
| { |
| arr.push(A3(f, xs._0, ys._0, zs._0)); |
| xs = xs._1; |
| ys = ys._1; |
| zs = zs._1; |
| } |
| return fromArray(arr); |
| } |
| |
| function map4(f, ws, xs, ys, zs) |
| { |
| var arr = []; |
| while ( ws.ctor !== '[]' |
| && xs.ctor !== '[]' |
| && ys.ctor !== '[]' |
| && zs.ctor !== '[]') |
| { |
| arr.push(A4(f, ws._0, xs._0, ys._0, zs._0)); |
| ws = ws._1; |
| xs = xs._1; |
| ys = ys._1; |
| zs = zs._1; |
| } |
| return fromArray(arr); |
| } |
| |
| function map5(f, vs, ws, xs, ys, zs) |
| { |
| var arr = []; |
| while ( vs.ctor !== '[]' |
| && ws.ctor !== '[]' |
| && xs.ctor !== '[]' |
| && ys.ctor !== '[]' |
| && zs.ctor !== '[]') |
| { |
| arr.push(A5(f, vs._0, ws._0, xs._0, ys._0, zs._0)); |
| vs = vs._1; |
| ws = ws._1; |
| xs = xs._1; |
| ys = ys._1; |
| zs = zs._1; |
| } |
| return fromArray(arr); |
| } |
| |
| function sortBy(f, xs) |
| { |
| return fromArray(toArray(xs).sort(function(a, b) { |
| return _elm_lang$core$Native_Utils.cmp(f(a), f(b)); |
| })); |
| } |
| |
| function sortWith(f, xs) |
| { |
| return fromArray(toArray(xs).sort(function(a, b) { |
| var ord = f(a)(b).ctor; |
| return ord === 'EQ' ? 0 : ord === 'LT' ? -1 : 1; |
| })); |
| } |
| |
| return { |
| Nil: Nil, |
| Cons: Cons, |
| cons: F2(Cons), |
| toArray: toArray, |
| fromArray: fromArray, |
| range: range, |
| |
| foldr: F3(foldr), |
| |
| map2: F3(map2), |
| map3: F4(map3), |
| map4: F5(map4), |
| map5: F6(map5), |
| sortBy: F2(sortBy), |
| sortWith: F2(sortWith) |
| }; |
| |
| }(); |
| var _elm_lang$core$List$sortWith = _elm_lang$core$Native_List.sortWith; |
| var _elm_lang$core$List$sortBy = _elm_lang$core$Native_List.sortBy; |
| var _elm_lang$core$List$sort = function (xs) { |
| return A2(_elm_lang$core$List$sortBy, _elm_lang$core$Basics$identity, xs); |
| }; |
| var _elm_lang$core$List$drop = F2( |
| function (n, list) { |
| drop: |
| while (true) { |
| if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { |
| return list; |
| } else { |
| var _p0 = list; |
| if (_p0.ctor === '[]') { |
| return list; |
| } else { |
| var _v1 = n - 1, |
| _v2 = _p0._1; |
| n = _v1; |
| list = _v2; |
| continue drop; |
| } |
| } |
| } |
| }); |
| var _elm_lang$core$List$map5 = _elm_lang$core$Native_List.map5; |
| var _elm_lang$core$List$map4 = _elm_lang$core$Native_List.map4; |
| var _elm_lang$core$List$map3 = _elm_lang$core$Native_List.map3; |
| var _elm_lang$core$List$map2 = _elm_lang$core$Native_List.map2; |
| var _elm_lang$core$List$any = F2( |
| function (isOkay, list) { |
| any: |
| while (true) { |
| var _p1 = list; |
| if (_p1.ctor === '[]') { |
| return false; |
| } else { |
| if (isOkay(_p1._0)) { |
| return true; |
| } else { |
| var _v4 = isOkay, |
| _v5 = _p1._1; |
| isOkay = _v4; |
| list = _v5; |
| continue any; |
| } |
| } |
| } |
| }); |
| var _elm_lang$core$List$all = F2( |
| function (isOkay, list) { |
| return _elm_lang$core$Basics$not( |
| A2( |
| _elm_lang$core$List$any, |
| function (_p2) { |
| return _elm_lang$core$Basics$not( |
| isOkay(_p2)); |
| }, |
| list)); |
| }); |
| var _elm_lang$core$List$foldr = _elm_lang$core$Native_List.foldr; |
| var _elm_lang$core$List$foldl = F3( |
| function (func, acc, list) { |
| foldl: |
| while (true) { |
| var _p3 = list; |
| if (_p3.ctor === '[]') { |
| return acc; |
| } else { |
| var _v7 = func, |
| _v8 = A2(func, _p3._0, acc), |
| _v9 = _p3._1; |
| func = _v7; |
| acc = _v8; |
| list = _v9; |
| continue foldl; |
| } |
| } |
| }); |
| var _elm_lang$core$List$length = function (xs) { |
| return A3( |
| _elm_lang$core$List$foldl, |
| F2( |
| function (_p4, i) { |
| return i + 1; |
| }), |
| 0, |
| xs); |
| }; |
| var _elm_lang$core$List$sum = function (numbers) { |
| return A3( |
| _elm_lang$core$List$foldl, |
| F2( |
| function (x, y) { |
| return x + y; |
| }), |
| 0, |
| numbers); |
| }; |
| var _elm_lang$core$List$product = function (numbers) { |
| return A3( |
| _elm_lang$core$List$foldl, |
| F2( |
| function (x, y) { |
| return x * y; |
| }), |
| 1, |
| numbers); |
| }; |
| var _elm_lang$core$List$maximum = function (list) { |
| var _p5 = list; |
| if (_p5.ctor === '::') { |
| return _elm_lang$core$Maybe$Just( |
| A3(_elm_lang$core$List$foldl, _elm_lang$core$Basics$max, _p5._0, _p5._1)); |
| } else { |
| return _elm_lang$core$Maybe$Nothing; |
| } |
| }; |
| var _elm_lang$core$List$minimum = function (list) { |
| var _p6 = list; |
| if (_p6.ctor === '::') { |
| return _elm_lang$core$Maybe$Just( |
| A3(_elm_lang$core$List$foldl, _elm_lang$core$Basics$min, _p6._0, _p6._1)); |
| } else { |
| return _elm_lang$core$Maybe$Nothing; |
| } |
| }; |
| var _elm_lang$core$List$indexedMap = F2( |
| function (f, xs) { |
| return A3( |
| _elm_lang$core$List$map2, |
| f, |
| _elm_lang$core$Native_List.range( |
| 0, |
| _elm_lang$core$List$length(xs) - 1), |
| xs); |
| }); |
| var _elm_lang$core$List$member = F2( |
| function (x, xs) { |
| return A2( |
| _elm_lang$core$List$any, |
| function (a) { |
| return _elm_lang$core$Native_Utils.eq(a, x); |
| }, |
| xs); |
| }); |
| var _elm_lang$core$List$isEmpty = function (xs) { |
| var _p7 = xs; |
| if (_p7.ctor === '[]') { |
| return true; |
| } else { |
| return false; |
| } |
| }; |
| var _elm_lang$core$List$tail = function (list) { |
| var _p8 = list; |
| if (_p8.ctor === '::') { |
| return _elm_lang$core$Maybe$Just(_p8._1); |
| } else { |
| return _elm_lang$core$Maybe$Nothing; |
| } |
| }; |
| var _elm_lang$core$List$head = function (list) { |
| var _p9 = list; |
| if (_p9.ctor === '::') { |
| return _elm_lang$core$Maybe$Just(_p9._0); |
| } else { |
| return _elm_lang$core$Maybe$Nothing; |
| } |
| }; |
| var _elm_lang$core$List_ops = _elm_lang$core$List_ops || {}; |
| _elm_lang$core$List_ops['::'] = _elm_lang$core$Native_List.cons; |
| var _elm_lang$core$List$map = F2( |
| function (f, xs) { |
| return A3( |
| _elm_lang$core$List$foldr, |
| F2( |
| function (x, acc) { |
| return A2( |
| _elm_lang$core$List_ops['::'], |
| f(x), |
| acc); |
| }), |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| xs); |
| }); |
| var _elm_lang$core$List$filter = F2( |
| function (pred, xs) { |
| var conditionalCons = F2( |
| function (x, xs$) { |
| return pred(x) ? A2(_elm_lang$core$List_ops['::'], x, xs$) : xs$; |
| }); |
| return A3( |
| _elm_lang$core$List$foldr, |
| conditionalCons, |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| xs); |
| }); |
| var _elm_lang$core$List$maybeCons = F3( |
| function (f, mx, xs) { |
| var _p10 = f(mx); |
| if (_p10.ctor === 'Just') { |
| return A2(_elm_lang$core$List_ops['::'], _p10._0, xs); |
| } else { |
| return xs; |
| } |
| }); |
| var _elm_lang$core$List$filterMap = F2( |
| function (f, xs) { |
| return A3( |
| _elm_lang$core$List$foldr, |
| _elm_lang$core$List$maybeCons(f), |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| xs); |
| }); |
| var _elm_lang$core$List$reverse = function (list) { |
| return A3( |
| _elm_lang$core$List$foldl, |
| F2( |
| function (x, y) { |
| return A2(_elm_lang$core$List_ops['::'], x, y); |
| }), |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| list); |
| }; |
| var _elm_lang$core$List$scanl = F3( |
| function (f, b, xs) { |
| var scan1 = F2( |
| function (x, accAcc) { |
| var _p11 = accAcc; |
| if (_p11.ctor === '::') { |
| return A2( |
| _elm_lang$core$List_ops['::'], |
| A2(f, x, _p11._0), |
| accAcc); |
| } else { |
| return _elm_lang$core$Native_List.fromArray( |
| []); |
| } |
| }); |
| return _elm_lang$core$List$reverse( |
| A3( |
| _elm_lang$core$List$foldl, |
| scan1, |
| _elm_lang$core$Native_List.fromArray( |
| [b]), |
| xs)); |
| }); |
| var _elm_lang$core$List$append = F2( |
| function (xs, ys) { |
| var _p12 = ys; |
| if (_p12.ctor === '[]') { |
| return xs; |
| } else { |
| return A3( |
| _elm_lang$core$List$foldr, |
| F2( |
| function (x, y) { |
| return A2(_elm_lang$core$List_ops['::'], x, y); |
| }), |
| ys, |
| xs); |
| } |
| }); |
| var _elm_lang$core$List$concat = function (lists) { |
| return A3( |
| _elm_lang$core$List$foldr, |
| _elm_lang$core$List$append, |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| lists); |
| }; |
| var _elm_lang$core$List$concatMap = F2( |
| function (f, list) { |
| return _elm_lang$core$List$concat( |
| A2(_elm_lang$core$List$map, f, list)); |
| }); |
| var _elm_lang$core$List$partition = F2( |
| function (pred, list) { |
| var step = F2( |
| function (x, _p13) { |
| var _p14 = _p13; |
| var _p16 = _p14._0; |
| var _p15 = _p14._1; |
| return pred(x) ? { |
| ctor: '_Tuple2', |
| _0: A2(_elm_lang$core$List_ops['::'], x, _p16), |
| _1: _p15 |
| } : { |
| ctor: '_Tuple2', |
| _0: _p16, |
| _1: A2(_elm_lang$core$List_ops['::'], x, _p15) |
| }; |
| }); |
| return A3( |
| _elm_lang$core$List$foldr, |
| step, |
| { |
| ctor: '_Tuple2', |
| _0: _elm_lang$core$Native_List.fromArray( |
| []), |
| _1: _elm_lang$core$Native_List.fromArray( |
| []) |
| }, |
| list); |
| }); |
| var _elm_lang$core$List$unzip = function (pairs) { |
| var step = F2( |
| function (_p18, _p17) { |
| var _p19 = _p18; |
| var _p20 = _p17; |
| return { |
| ctor: '_Tuple2', |
| _0: A2(_elm_lang$core$List_ops['::'], _p19._0, _p20._0), |
| _1: A2(_elm_lang$core$List_ops['::'], _p19._1, _p20._1) |
| }; |
| }); |
| return A3( |
| _elm_lang$core$List$foldr, |
| step, |
| { |
| ctor: '_Tuple2', |
| _0: _elm_lang$core$Native_List.fromArray( |
| []), |
| _1: _elm_lang$core$Native_List.fromArray( |
| []) |
| }, |
| pairs); |
| }; |
| var _elm_lang$core$List$intersperse = F2( |
| function (sep, xs) { |
| var _p21 = xs; |
| if (_p21.ctor === '[]') { |
| return _elm_lang$core$Native_List.fromArray( |
| []); |
| } else { |
| var step = F2( |
| function (x, rest) { |
| return A2( |
| _elm_lang$core$List_ops['::'], |
| sep, |
| A2(_elm_lang$core$List_ops['::'], x, rest)); |
| }); |
| var spersed = A3( |
| _elm_lang$core$List$foldr, |
| step, |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| _p21._1); |
| return A2(_elm_lang$core$List_ops['::'], _p21._0, spersed); |
| } |
| }); |
| var _elm_lang$core$List$takeReverse = F3( |
| function (n, list, taken) { |
| takeReverse: |
| while (true) { |
| if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { |
| return taken; |
| } else { |
| var _p22 = list; |
| if (_p22.ctor === '[]') { |
| return taken; |
| } else { |
| var _v23 = n - 1, |
| _v24 = _p22._1, |
| _v25 = A2(_elm_lang$core$List_ops['::'], _p22._0, taken); |
| n = _v23; |
| list = _v24; |
| taken = _v25; |
| continue takeReverse; |
| } |
| } |
| } |
| }); |
| var _elm_lang$core$List$takeTailRec = F2( |
| function (n, list) { |
| return _elm_lang$core$List$reverse( |
| A3( |
| _elm_lang$core$List$takeReverse, |
| n, |
| list, |
| _elm_lang$core$Native_List.fromArray( |
| []))); |
| }); |
| var _elm_lang$core$List$takeFast = F3( |
| function (ctr, n, list) { |
| if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { |
| return _elm_lang$core$Native_List.fromArray( |
| []); |
| } else { |
| var _p23 = {ctor: '_Tuple2', _0: n, _1: list}; |
| _v26_5: |
| do { |
| _v26_1: |
| do { |
| if (_p23.ctor === '_Tuple2') { |
| if (_p23._1.ctor === '[]') { |
| return list; |
| } else { |
| if (_p23._1._1.ctor === '::') { |
| switch (_p23._0) { |
| case 1: |
| break _v26_1; |
| case 2: |
| return _elm_lang$core$Native_List.fromArray( |
| [_p23._1._0, _p23._1._1._0]); |
| case 3: |
| if (_p23._1._1._1.ctor === '::') { |
| return _elm_lang$core$Native_List.fromArray( |
| [_p23._1._0, _p23._1._1._0, _p23._1._1._1._0]); |
| } else { |
| break _v26_5; |
| } |
| default: |
| if ((_p23._1._1._1.ctor === '::') && (_p23._1._1._1._1.ctor === '::')) { |
| var _p28 = _p23._1._1._1._0; |
| var _p27 = _p23._1._1._0; |
| var _p26 = _p23._1._0; |
| var _p25 = _p23._1._1._1._1._0; |
| var _p24 = _p23._1._1._1._1._1; |
| return (_elm_lang$core$Native_Utils.cmp(ctr, 1000) > 0) ? A2( |
| _elm_lang$core$List_ops['::'], |
| _p26, |
| A2( |
| _elm_lang$core$List_ops['::'], |
| _p27, |
| A2( |
| _elm_lang$core$List_ops['::'], |
| _p28, |
| A2( |
| _elm_lang$core$List_ops['::'], |
| _p25, |
| A2(_elm_lang$core$List$takeTailRec, n - 4, _p24))))) : A2( |
| _elm_lang$core$List_ops['::'], |
| _p26, |
| A2( |
| _elm_lang$core$List_ops['::'], |
| _p27, |
| A2( |
| _elm_lang$core$List_ops['::'], |
| _p28, |
| A2( |
| _elm_lang$core$List_ops['::'], |
| _p25, |
| A3(_elm_lang$core$List$takeFast, ctr + 1, n - 4, _p24))))); |
| } else { |
| break _v26_5; |
| } |
| } |
| } else { |
| if (_p23._0 === 1) { |
| break _v26_1; |
| } else { |
| break _v26_5; |
| } |
| } |
| } |
| } else { |
| break _v26_5; |
| } |
| } while(false); |
| return _elm_lang$core$Native_List.fromArray( |
| [_p23._1._0]); |
| } while(false); |
| return list; |
| } |
| }); |
| var _elm_lang$core$List$take = F2( |
| function (n, list) { |
| return A3(_elm_lang$core$List$takeFast, 0, n, list); |
| }); |
| var _elm_lang$core$List$repeatHelp = F3( |
| function (result, n, value) { |
| repeatHelp: |
| while (true) { |
| if (_elm_lang$core$Native_Utils.cmp(n, 0) < 1) { |
| return result; |
| } else { |
| var _v27 = A2(_elm_lang$core$List_ops['::'], value, result), |
| _v28 = n - 1, |
| _v29 = value; |
| result = _v27; |
| n = _v28; |
| value = _v29; |
| continue repeatHelp; |
| } |
| } |
| }); |
| var _elm_lang$core$List$repeat = F2( |
| function (n, value) { |
| return A3( |
| _elm_lang$core$List$repeatHelp, |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| n, |
| value); |
| }); |
| |
| var _elm_lang$core$Result$toMaybe = function (result) { |
| var _p0 = result; |
| if (_p0.ctor === 'Ok') { |
| return _elm_lang$core$Maybe$Just(_p0._0); |
| } else { |
| return _elm_lang$core$Maybe$Nothing; |
| } |
| }; |
| var _elm_lang$core$Result$withDefault = F2( |
| function (def, result) { |
| var _p1 = result; |
| if (_p1.ctor === 'Ok') { |
| return _p1._0; |
| } else { |
| return def; |
| } |
| }); |
| var _elm_lang$core$Result$Err = function (a) { |
| return {ctor: 'Err', _0: a}; |
| }; |
| var _elm_lang$core$Result$andThen = F2( |
| function (result, callback) { |
| var _p2 = result; |
| if (_p2.ctor === 'Ok') { |
| return callback(_p2._0); |
| } else { |
| return _elm_lang$core$Result$Err(_p2._0); |
| } |
| }); |
| var _elm_lang$core$Result$Ok = function (a) { |
| return {ctor: 'Ok', _0: a}; |
| }; |
| var _elm_lang$core$Result$map = F2( |
| function (func, ra) { |
| var _p3 = ra; |
| if (_p3.ctor === 'Ok') { |
| return _elm_lang$core$Result$Ok( |
| func(_p3._0)); |
| } else { |
| return _elm_lang$core$Result$Err(_p3._0); |
| } |
| }); |
| var _elm_lang$core$Result$map2 = F3( |
| function (func, ra, rb) { |
| var _p4 = {ctor: '_Tuple2', _0: ra, _1: rb}; |
| if (_p4._0.ctor === 'Ok') { |
| if (_p4._1.ctor === 'Ok') { |
| return _elm_lang$core$Result$Ok( |
| A2(func, _p4._0._0, _p4._1._0)); |
| } else { |
| return _elm_lang$core$Result$Err(_p4._1._0); |
| } |
| } else { |
| return _elm_lang$core$Result$Err(_p4._0._0); |
| } |
| }); |
| var _elm_lang$core$Result$map3 = F4( |
| function (func, ra, rb, rc) { |
| var _p5 = {ctor: '_Tuple3', _0: ra, _1: rb, _2: rc}; |
| if (_p5._0.ctor === 'Ok') { |
| if (_p5._1.ctor === 'Ok') { |
| if (_p5._2.ctor === 'Ok') { |
| return _elm_lang$core$Result$Ok( |
| A3(func, _p5._0._0, _p5._1._0, _p5._2._0)); |
| } else { |
| return _elm_lang$core$Result$Err(_p5._2._0); |
| } |
| } else { |
| return _elm_lang$core$Result$Err(_p5._1._0); |
| } |
| } else { |
| return _elm_lang$core$Result$Err(_p5._0._0); |
| } |
| }); |
| var _elm_lang$core$Result$map4 = F5( |
| function (func, ra, rb, rc, rd) { |
| var _p6 = {ctor: '_Tuple4', _0: ra, _1: rb, _2: rc, _3: rd}; |
| if (_p6._0.ctor === 'Ok') { |
| if (_p6._1.ctor === 'Ok') { |
| if (_p6._2.ctor === 'Ok') { |
| if (_p6._3.ctor === 'Ok') { |
| return _elm_lang$core$Result$Ok( |
| A4(func, _p6._0._0, _p6._1._0, _p6._2._0, _p6._3._0)); |
| } else { |
| return _elm_lang$core$Result$Err(_p6._3._0); |
| } |
| } else { |
| return _elm_lang$core$Result$Err(_p6._2._0); |
| } |
| } else { |
| return _elm_lang$core$Result$Err(_p6._1._0); |
| } |
| } else { |
| return _elm_lang$core$Result$Err(_p6._0._0); |
| } |
| }); |
| var _elm_lang$core$Result$map5 = F6( |
| function (func, ra, rb, rc, rd, re) { |
| var _p7 = {ctor: '_Tuple5', _0: ra, _1: rb, _2: rc, _3: rd, _4: re}; |
| if (_p7._0.ctor === 'Ok') { |
| if (_p7._1.ctor === 'Ok') { |
| if (_p7._2.ctor === 'Ok') { |
| if (_p7._3.ctor === 'Ok') { |
| if (_p7._4.ctor === 'Ok') { |
| return _elm_lang$core$Result$Ok( |
| A5(func, _p7._0._0, _p7._1._0, _p7._2._0, _p7._3._0, _p7._4._0)); |
| } else { |
| return _elm_lang$core$Result$Err(_p7._4._0); |
| } |
| } else { |
| return _elm_lang$core$Result$Err(_p7._3._0); |
| } |
| } else { |
| return _elm_lang$core$Result$Err(_p7._2._0); |
| } |
| } else { |
| return _elm_lang$core$Result$Err(_p7._1._0); |
| } |
| } else { |
| return _elm_lang$core$Result$Err(_p7._0._0); |
| } |
| }); |
| var _elm_lang$core$Result$formatError = F2( |
| function (f, result) { |
| var _p8 = result; |
| if (_p8.ctor === 'Ok') { |
| return _elm_lang$core$Result$Ok(_p8._0); |
| } else { |
| return _elm_lang$core$Result$Err( |
| f(_p8._0)); |
| } |
| }); |
| var _elm_lang$core$Result$fromMaybe = F2( |
| function (err, maybe) { |
| var _p9 = maybe; |
| if (_p9.ctor === 'Just') { |
| return _elm_lang$core$Result$Ok(_p9._0); |
| } else { |
| return _elm_lang$core$Result$Err(err); |
| } |
| }); |
| |
| //import // |
| |
| var _elm_lang$core$Native_Platform = function() { |
| |
| |
| // PROGRAMS |
| |
| function addPublicModule(object, name, main) |
| { |
| var init = main ? makeEmbed(name, main) : mainIsUndefined(name); |
| |
| object['worker'] = function worker(flags) |
| { |
| return init(undefined, flags, false); |
| } |
| |
| object['embed'] = function embed(domNode, flags) |
| { |
| return init(domNode, flags, true); |
| } |
| |
| object['fullscreen'] = function fullscreen(flags) |
| { |
| return init(document.body, flags, true); |
| }; |
| } |
| |
| |
| // PROGRAM FAIL |
| |
| function mainIsUndefined(name) |
| { |
| return function(domNode) |
| { |
| var message = 'Cannot initialize module `' + name + |
| '` because it has no `main` value!\nWhat should I show on screen?'; |
| domNode.innerHTML = errorHtml(message); |
| throw new Error(message); |
| }; |
| } |
| |
| function errorHtml(message) |
| { |
| return '<div style="padding-left:1em;">' |
| + '<h2 style="font-weight:normal;"><b>Oops!</b> Something went wrong when starting your Elm program.</h2>' |
| + '<pre style="padding-left:1em;">' + message + '</pre>' |
| + '</div>'; |
| } |
| |
| |
| // PROGRAM SUCCESS |
| |
| function makeEmbed(moduleName, main) |
| { |
| return function embed(rootDomNode, flags, withRenderer) |
| { |
| try |
| { |
| var program = mainToProgram(moduleName, main); |
| if (!withRenderer) |
| { |
| program.renderer = dummyRenderer; |
| } |
| return makeEmbedHelp(moduleName, program, rootDomNode, flags); |
| } |
| catch (e) |
| { |
| rootDomNode.innerHTML = errorHtml(e.message); |
| throw e; |
| } |
| }; |
| } |
| |
| function dummyRenderer() |
| { |
| return { update: function() {} }; |
| } |
| |
| |
| // MAIN TO PROGRAM |
| |
| function mainToProgram(moduleName, wrappedMain) |
| { |
| var main = wrappedMain.main; |
| |
| if (typeof main.init === 'undefined') |
| { |
| var emptyBag = batch(_elm_lang$core$Native_List.Nil); |
| var noChange = _elm_lang$core$Native_Utils.Tuple2( |
| _elm_lang$core$Native_Utils.Tuple0, |
| emptyBag |
| ); |
| |
| return _elm_lang$virtual_dom$VirtualDom$programWithFlags({ |
| init: function() { return noChange; }, |
| view: function() { return main; }, |
| update: F2(function() { return noChange; }), |
| subscriptions: function () { return emptyBag; } |
| }); |
| } |
| |
| var flags = wrappedMain.flags; |
| var init = flags |
| ? initWithFlags(moduleName, main.init, flags) |
| : initWithoutFlags(moduleName, main.init); |
| |
| return _elm_lang$virtual_dom$VirtualDom$programWithFlags({ |
| init: init, |
| view: main.view, |
| update: main.update, |
| subscriptions: main.subscriptions, |
| }); |
| } |
| |
| function initWithoutFlags(moduleName, realInit) |
| { |
| return function init(flags) |
| { |
| if (typeof flags !== 'undefined') |
| { |
| throw new Error( |
| 'You are giving module `' + moduleName + '` an argument in JavaScript.\n' |
| + 'This module does not take arguments though! You probably need to change the\n' |
| + 'initialization code to something like `Elm.' + moduleName + '.fullscreen()`' |
| ); |
| } |
| return realInit(); |
| }; |
| } |
| |
| function initWithFlags(moduleName, realInit, flagDecoder) |
| { |
| return function init(flags) |
| { |
| var result = A2(_elm_lang$core$Native_Json.run, flagDecoder, flags); |
| if (result.ctor === 'Err') |
| { |
| throw new Error( |
| 'You are trying to initialize module `' + moduleName + '` with an unexpected argument.\n' |
| + 'When trying to convert it to a usable Elm value, I run into this problem:\n\n' |
| + result._0 |
| ); |
| } |
| return realInit(result._0); |
| }; |
| } |
| |
| |
| // SETUP RUNTIME SYSTEM |
| |
| function makeEmbedHelp(moduleName, program, rootDomNode, flags) |
| { |
| var init = program.init; |
| var update = program.update; |
| var subscriptions = program.subscriptions; |
| var view = program.view; |
| var makeRenderer = program.renderer; |
| |
| // ambient state |
| var managers = {}; |
| var renderer; |
| |
| // init and update state in main process |
| var initApp = _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) { |
| var results = init(flags); |
| var model = results._0; |
| renderer = makeRenderer(rootDomNode, enqueue, view(model)); |
| var cmds = results._1; |
| var subs = subscriptions(model); |
| dispatchEffects(managers, cmds, subs); |
| callback(_elm_lang$core$Native_Scheduler.succeed(model)); |
| }); |
| |
| function onMessage(msg, model) |
| { |
| return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) { |
| var results = A2(update, msg, model); |
| model = results._0; |
| renderer.update(view(model)); |
| var cmds = results._1; |
| var subs = subscriptions(model); |
| dispatchEffects(managers, cmds, subs); |
| callback(_elm_lang$core$Native_Scheduler.succeed(model)); |
| }); |
| } |
| |
| var mainProcess = spawnLoop(initApp, onMessage); |
| |
| function enqueue(msg) |
| { |
| _elm_lang$core$Native_Scheduler.rawSend(mainProcess, msg); |
| } |
| |
| var ports = setupEffects(managers, enqueue); |
| |
| return ports ? { ports: ports } : {}; |
| } |
| |
| |
| // EFFECT MANAGERS |
| |
| var effectManagers = {}; |
| |
| function setupEffects(managers, callback) |
| { |
| var ports; |
| |
| // setup all necessary effect managers |
| for (var key in effectManagers) |
| { |
| var manager = effectManagers[key]; |
| |
| if (manager.isForeign) |
| { |
| ports = ports || {}; |
| ports[key] = manager.tag === 'cmd' |
| ? setupOutgoingPort(key) |
| : setupIncomingPort(key, callback); |
| } |
| |
| managers[key] = makeManager(manager, callback); |
| } |
| |
| return ports; |
| } |
| |
| function makeManager(info, callback) |
| { |
| var router = { |
| main: callback, |
| self: undefined |
| }; |
| |
| var tag = info.tag; |
| var onEffects = info.onEffects; |
| var onSelfMsg = info.onSelfMsg; |
| |
| function onMessage(msg, state) |
| { |
| if (msg.ctor === 'self') |
| { |
| return A3(onSelfMsg, router, msg._0, state); |
| } |
| |
| var fx = msg._0; |
| switch (tag) |
| { |
| case 'cmd': |
| return A3(onEffects, router, fx.cmds, state); |
| |
| case 'sub': |
| return A3(onEffects, router, fx.subs, state); |
| |
| case 'fx': |
| return A4(onEffects, router, fx.cmds, fx.subs, state); |
| } |
| } |
| |
| var process = spawnLoop(info.init, onMessage); |
| router.self = process; |
| return process; |
| } |
| |
| function sendToApp(router, msg) |
| { |
| return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) |
| { |
| router.main(msg); |
| callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0)); |
| }); |
| } |
| |
| function sendToSelf(router, msg) |
| { |
| return A2(_elm_lang$core$Native_Scheduler.send, router.self, { |
| ctor: 'self', |
| _0: msg |
| }); |
| } |
| |
| |
| // HELPER for STATEFUL LOOPS |
| |
| function spawnLoop(init, onMessage) |
| { |
| var andThen = _elm_lang$core$Native_Scheduler.andThen; |
| |
| function loop(state) |
| { |
| var handleMsg = _elm_lang$core$Native_Scheduler.receive(function(msg) { |
| return onMessage(msg, state); |
| }); |
| return A2(andThen, handleMsg, loop); |
| } |
| |
| var task = A2(andThen, init, loop); |
| |
| return _elm_lang$core$Native_Scheduler.rawSpawn(task); |
| } |
| |
| |
| // BAGS |
| |
| function leaf(home) |
| { |
| return function(value) |
| { |
| return { |
| type: 'leaf', |
| home: home, |
| value: value |
| }; |
| }; |
| } |
| |
| function batch(list) |
| { |
| return { |
| type: 'node', |
| branches: list |
| }; |
| } |
| |
| function map(tagger, bag) |
| { |
| return { |
| type: 'map', |
| tagger: tagger, |
| tree: bag |
| } |
| } |
| |
| |
| // PIPE BAGS INTO EFFECT MANAGERS |
| |
| function dispatchEffects(managers, cmdBag, subBag) |
| { |
| var effectsDict = {}; |
| gatherEffects(true, cmdBag, effectsDict, null); |
| gatherEffects(false, subBag, effectsDict, null); |
| |
| for (var home in managers) |
| { |
| var fx = home in effectsDict |
| ? effectsDict[home] |
| : { |
| cmds: _elm_lang$core$Native_List.Nil, |
| subs: _elm_lang$core$Native_List.Nil |
| }; |
| |
| _elm_lang$core$Native_Scheduler.rawSend(managers[home], { ctor: 'fx', _0: fx }); |
| } |
| } |
| |
| function gatherEffects(isCmd, bag, effectsDict, taggers) |
| { |
| switch (bag.type) |
| { |
| case 'leaf': |
| var home = bag.home; |
| var effect = toEffect(isCmd, home, taggers, bag.value); |
| effectsDict[home] = insert(isCmd, effect, effectsDict[home]); |
| return; |
| |
| case 'node': |
| var list = bag.branches; |
| while (list.ctor !== '[]') |
| { |
| gatherEffects(isCmd, list._0, effectsDict, taggers); |
| list = list._1; |
| } |
| return; |
| |
| case 'map': |
| gatherEffects(isCmd, bag.tree, effectsDict, { |
| tagger: bag.tagger, |
| rest: taggers |
| }); |
| return; |
| } |
| } |
| |
| function toEffect(isCmd, home, taggers, value) |
| { |
| function applyTaggers(x) |
| { |
| var temp = taggers; |
| while (temp) |
| { |
| x = temp.tagger(x); |
| temp = temp.rest; |
| } |
| return x; |
| } |
| |
| var map = isCmd |
| ? effectManagers[home].cmdMap |
| : effectManagers[home].subMap; |
| |
| return A2(map, applyTaggers, value) |
| } |
| |
| function insert(isCmd, newEffect, effects) |
| { |
| effects = effects || { |
| cmds: _elm_lang$core$Native_List.Nil, |
| subs: _elm_lang$core$Native_List.Nil |
| }; |
| if (isCmd) |
| { |
| effects.cmds = _elm_lang$core$Native_List.Cons(newEffect, effects.cmds); |
| return effects; |
| } |
| effects.subs = _elm_lang$core$Native_List.Cons(newEffect, effects.subs); |
| return effects; |
| } |
| |
| |
| // PORTS |
| |
| function checkPortName(name) |
| { |
| if (name in effectManagers) |
| { |
| throw new Error('There can only be one port named `' + name + '`, but your program has multiple.'); |
| } |
| } |
| |
| |
| // OUTGOING PORTS |
| |
| function outgoingPort(name, converter) |
| { |
| checkPortName(name); |
| effectManagers[name] = { |
| tag: 'cmd', |
| cmdMap: outgoingPortMap, |
| converter: converter, |
| isForeign: true |
| }; |
| return leaf(name); |
| } |
| |
| var outgoingPortMap = F2(function cmdMap(tagger, value) { |
| return value; |
| }); |
| |
| function setupOutgoingPort(name) |
| { |
| var subs = []; |
| var converter = effectManagers[name].converter; |
| |
| // CREATE MANAGER |
| |
| var init = _elm_lang$core$Native_Scheduler.succeed(null); |
| |
| function onEffects(router, cmdList, state) |
| { |
| while (cmdList.ctor !== '[]') |
| { |
| var value = converter(cmdList._0); |
| for (var i = 0; i < subs.length; i++) |
| { |
| subs[i](value); |
| } |
| cmdList = cmdList._1; |
| } |
| return init; |
| } |
| |
| effectManagers[name].init = init; |
| effectManagers[name].onEffects = F3(onEffects); |
| |
| // PUBLIC API |
| |
| function subscribe(callback) |
| { |
| subs.push(callback); |
| } |
| |
| function unsubscribe(callback) |
| { |
| var index = subs.indexOf(callback); |
| if (index >= 0) |
| { |
| subs.splice(index, 1); |
| } |
| } |
| |
| return { |
| subscribe: subscribe, |
| unsubscribe: unsubscribe |
| }; |
| } |
| |
| |
| // INCOMING PORTS |
| |
| function incomingPort(name, converter) |
| { |
| checkPortName(name); |
| effectManagers[name] = { |
| tag: 'sub', |
| subMap: incomingPortMap, |
| converter: converter, |
| isForeign: true |
| }; |
| return leaf(name); |
| } |
| |
| var incomingPortMap = F2(function subMap(tagger, finalTagger) |
| { |
| return function(value) |
| { |
| return tagger(finalTagger(value)); |
| }; |
| }); |
| |
| function setupIncomingPort(name, callback) |
| { |
| var sentBeforeInit = []; |
| var subs = _elm_lang$core$Native_List.Nil; |
| var converter = effectManagers[name].converter; |
| var currentOnEffects = preInitOnEffects; |
| var currentSend = preInitSend; |
| |
| // CREATE MANAGER |
| |
| var init = _elm_lang$core$Native_Scheduler.succeed(null); |
| |
| function preInitOnEffects(router, subList, state) |
| { |
| var postInitResult = postInitOnEffects(router, subList, state); |
| |
| for(var i = 0; i < sentBeforeInit.length; i++) |
| { |
| postInitSend(sentBeforeInit[i]); |
| } |
| |
| sentBeforeInit = null; // to release objects held in queue |
| currentSend = postInitSend; |
| currentOnEffects = postInitOnEffects; |
| return postInitResult; |
| } |
| |
| function postInitOnEffects(router, subList, state) |
| { |
| subs = subList; |
| return init; |
| } |
| |
| function onEffects(router, subList, state) |
| { |
| return currentOnEffects(router, subList, state); |
| } |
| |
| effectManagers[name].init = init; |
| effectManagers[name].onEffects = F3(onEffects); |
| |
| // PUBLIC API |
| |
| function preInitSend(value) |
| { |
| sentBeforeInit.push(value); |
| } |
| |
| function postInitSend(incomingValue) |
| { |
| var result = A2(_elm_lang$core$Json_Decode$decodeValue, converter, incomingValue); |
| if (result.ctor === 'Err') |
| { |
| throw new Error('Trying to send an unexpected type of value through port `' + name + '`:\n' + result._0); |
| } |
| |
| var value = result._0; |
| var temp = subs; |
| while (temp.ctor !== '[]') |
| { |
| callback(temp._0(value)); |
| temp = temp._1; |
| } |
| } |
| |
| function send(incomingValue) |
| { |
| currentSend(incomingValue); |
| } |
| |
| return { send: send }; |
| } |
| |
| return { |
| // routers |
| sendToApp: F2(sendToApp), |
| sendToSelf: F2(sendToSelf), |
| |
| // global setup |
| mainToProgram: mainToProgram, |
| effectManagers: effectManagers, |
| outgoingPort: outgoingPort, |
| incomingPort: incomingPort, |
| addPublicModule: addPublicModule, |
| |
| // effect bags |
| leaf: leaf, |
| batch: batch, |
| map: F2(map) |
| }; |
| |
| }(); |
| |
| //import Native.Utils // |
| |
| var _elm_lang$core$Native_Scheduler = function() { |
| |
| var MAX_STEPS = 10000; |
| |
| |
| // TASKS |
| |
| function succeed(value) |
| { |
| return { |
| ctor: '_Task_succeed', |
| value: value |
| }; |
| } |
| |
| function fail(error) |
| { |
| return { |
| ctor: '_Task_fail', |
| value: error |
| }; |
| } |
| |
| function nativeBinding(callback) |
| { |
| return { |
| ctor: '_Task_nativeBinding', |
| callback: callback, |
| cancel: null |
| }; |
| } |
| |
| function andThen(task, callback) |
| { |
| return { |
| ctor: '_Task_andThen', |
| task: task, |
| callback: callback |
| }; |
| } |
| |
| function onError(task, callback) |
| { |
| return { |
| ctor: '_Task_onError', |
| task: task, |
| callback: callback |
| }; |
| } |
| |
| function receive(callback) |
| { |
| return { |
| ctor: '_Task_receive', |
| callback: callback |
| }; |
| } |
| |
| |
| // PROCESSES |
| |
| function rawSpawn(task) |
| { |
| var process = { |
| ctor: '_Process', |
| id: _elm_lang$core$Native_Utils.guid(), |
| root: task, |
| stack: null, |
| mailbox: [] |
| }; |
| |
| enqueue(process); |
| |
| return process; |
| } |
| |
| function spawn(task) |
| { |
| return nativeBinding(function(callback) { |
| var process = rawSpawn(task); |
| callback(succeed(process)); |
| }); |
| } |
| |
| function rawSend(process, msg) |
| { |
| process.mailbox.push(msg); |
| enqueue(process); |
| } |
| |
| function send(process, msg) |
| { |
| return nativeBinding(function(callback) { |
| rawSend(process, msg); |
| callback(succeed(_elm_lang$core$Native_Utils.Tuple0)); |
| }); |
| } |
| |
| function kill(process) |
| { |
| return nativeBinding(function(callback) { |
| var root = process.root; |
| if (root.ctor === '_Task_nativeBinding' && root.cancel) |
| { |
| root.cancel(); |
| } |
| |
| process.root = null; |
| |
| callback(succeed(_elm_lang$core$Native_Utils.Tuple0)); |
| }); |
| } |
| |
| function sleep(time) |
| { |
| return nativeBinding(function(callback) { |
| var id = setTimeout(function() { |
| callback(succeed(_elm_lang$core$Native_Utils.Tuple0)); |
| }, time); |
| |
| return function() { clearTimeout(id); }; |
| }); |
| } |
| |
| |
| // STEP PROCESSES |
| |
| function step(numSteps, process) |
| { |
| while (numSteps < MAX_STEPS) |
| { |
| var ctor = process.root.ctor; |
| |
| if (ctor === '_Task_succeed') |
| { |
| while (process.stack && process.stack.ctor === '_Task_onError') |
| { |
| process.stack = process.stack.rest; |
| } |
| if (process.stack === null) |
| { |
| break; |
| } |
| process.root = process.stack.callback(process.root.value); |
| process.stack = process.stack.rest; |
| ++numSteps; |
| continue; |
| } |
| |
| if (ctor === '_Task_fail') |
| { |
| while (process.stack && process.stack.ctor === '_Task_andThen') |
| { |
| process.stack = process.stack.rest; |
| } |
| if (process.stack === null) |
| { |
| break; |
| } |
| process.root = process.stack.callback(process.root.value); |
| process.stack = process.stack.rest; |
| ++numSteps; |
| continue; |
| } |
| |
| if (ctor === '_Task_andThen') |
| { |
| process.stack = { |
| ctor: '_Task_andThen', |
| callback: process.root.callback, |
| rest: process.stack |
| }; |
| process.root = process.root.task; |
| ++numSteps; |
| continue; |
| } |
| |
| if (ctor === '_Task_onError') |
| { |
| process.stack = { |
| ctor: '_Task_onError', |
| callback: process.root.callback, |
| rest: process.stack |
| }; |
| process.root = process.root.task; |
| ++numSteps; |
| continue; |
| } |
| |
| if (ctor === '_Task_nativeBinding') |
| { |
| process.root.cancel = process.root.callback(function(newRoot) { |
| process.root = newRoot; |
| enqueue(process); |
| }); |
| |
| break; |
| } |
| |
| if (ctor === '_Task_receive') |
| { |
| var mailbox = process.mailbox; |
| if (mailbox.length === 0) |
| { |
| break; |
| } |
| |
| process.root = process.root.callback(mailbox.shift()); |
| ++numSteps; |
| continue; |
| } |
| |
| throw new Error(ctor); |
| } |
| |
| if (numSteps < MAX_STEPS) |
| { |
| return numSteps + 1; |
| } |
| enqueue(process); |
| |
| return numSteps; |
| } |
| |
| |
| // WORK QUEUE |
| |
| var working = false; |
| var workQueue = []; |
| |
| function enqueue(process) |
| { |
| workQueue.push(process); |
| |
| if (!working) |
| { |
| setTimeout(work, 0); |
| working = true; |
| } |
| } |
| |
| function work() |
| { |
| var numSteps = 0; |
| var process; |
| while (numSteps < MAX_STEPS && (process = workQueue.shift())) |
| { |
| if (process.root) |
| { |
| numSteps = step(numSteps, process); |
| } |
| } |
| if (!process) |
| { |
| working = false; |
| return; |
| } |
| setTimeout(work, 0); |
| } |
| window.elmWork = work; |
| |
| return { |
| succeed: succeed, |
| fail: fail, |
| nativeBinding: nativeBinding, |
| andThen: F2(andThen), |
| onError: F2(onError), |
| receive: receive, |
| |
| spawn: spawn, |
| kill: kill, |
| sleep: sleep, |
| send: F2(send), |
| |
| rawSpawn: rawSpawn, |
| rawSend: rawSend |
| }; |
| |
| }(); |
| var _elm_lang$core$Platform$hack = _elm_lang$core$Native_Scheduler.succeed; |
| var _elm_lang$core$Platform$sendToSelf = _elm_lang$core$Native_Platform.sendToSelf; |
| var _elm_lang$core$Platform$sendToApp = _elm_lang$core$Native_Platform.sendToApp; |
| var _elm_lang$core$Platform$Program = {ctor: 'Program'}; |
| var _elm_lang$core$Platform$Task = {ctor: 'Task'}; |
| var _elm_lang$core$Platform$ProcessId = {ctor: 'ProcessId'}; |
| var _elm_lang$core$Platform$Router = {ctor: 'Router'}; |
| |
| var _elm_lang$core$Platform_Cmd$batch = _elm_lang$core$Native_Platform.batch; |
| var _elm_lang$core$Platform_Cmd$none = _elm_lang$core$Platform_Cmd$batch( |
| _elm_lang$core$Native_List.fromArray( |
| [])); |
| var _elm_lang$core$Platform_Cmd_ops = _elm_lang$core$Platform_Cmd_ops || {}; |
| _elm_lang$core$Platform_Cmd_ops['!'] = F2( |
| function (model, commands) { |
| return { |
| ctor: '_Tuple2', |
| _0: model, |
| _1: _elm_lang$core$Platform_Cmd$batch(commands) |
| }; |
| }); |
| var _elm_lang$core$Platform_Cmd$map = _elm_lang$core$Native_Platform.map; |
| var _elm_lang$core$Platform_Cmd$Cmd = {ctor: 'Cmd'}; |
| |
| var _elm_lang$core$Platform_Sub$batch = _elm_lang$core$Native_Platform.batch; |
| var _elm_lang$core$Platform_Sub$none = _elm_lang$core$Platform_Sub$batch( |
| _elm_lang$core$Native_List.fromArray( |
| [])); |
| var _elm_lang$core$Platform_Sub$map = _elm_lang$core$Native_Platform.map; |
| var _elm_lang$core$Platform_Sub$Sub = {ctor: 'Sub'}; |
| |
| //import Maybe, Native.List, Native.Utils, Result // |
| |
| var _elm_lang$core$Native_String = function() { |
| |
| function isEmpty(str) |
| { |
| return str.length === 0; |
| } |
| function cons(chr, str) |
| { |
| return chr + str; |
| } |
| function uncons(str) |
| { |
| var hd = str[0]; |
| if (hd) |
| { |
| return _elm_lang$core$Maybe$Just(_elm_lang$core$Native_Utils.Tuple2(_elm_lang$core$Native_Utils.chr(hd), str.slice(1))); |
| } |
| return _elm_lang$core$Maybe$Nothing; |
| } |
| function append(a, b) |
| { |
| return a + b; |
| } |
| function concat(strs) |
| { |
| return _elm_lang$core$Native_List.toArray(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(_elm_lang$core$Native_Utils.chr(out[i])); |
| } |
| return out.join(''); |
| } |
| function filter(pred, str) |
| { |
| return str.split('').map(_elm_lang$core$Native_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, _elm_lang$core$Native_Utils.chr(str[i]), b); |
| } |
| return b; |
| } |
| function foldr(f, b, str) |
| { |
| for (var i = str.length; i--; ) |
| { |
| b = A2(f, _elm_lang$core$Native_Utils.chr(str[i]), b); |
| } |
| return b; |
| } |
| function split(sep, str) |
| { |
| return _elm_lang$core$Native_List.fromArray(str.split(sep)); |
| } |
| function join(sep, strs) |
| { |
| return _elm_lang$core$Native_List.toArray(strs).join(sep); |
| } |
| function repeat(n, str) |
| { |
| var result = ''; |
| while (n > 0) |
| { |
| if (n & 1) |
| { |
| result += str; |
| } |
| n >>= 1, str += str; |
| } |
| return result; |
| } |
| function slice(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.replace(/^\s+/, ''); |
| } |
| function trimRight(str) |
| { |
| return str.replace(/\s+$/, ''); |
| } |
| |
| function words(str) |
| { |
| return _elm_lang$core$Native_List.fromArray(str.trim().split(/\s+/g)); |
| } |
| function lines(str) |
| { |
| return _elm_lang$core$Native_List.fromArray(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(_elm_lang$core$Native_Utils.chr(str[i]))) |
| { |
| return true; |
| } |
| } |
| return false; |
| } |
| function all(pred, str) |
| { |
| for (var i = str.length; i--; ) |
| { |
| if (!pred(_elm_lang$core$Native_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; |
| |
| if (subLen < 1) |
| { |
| return _elm_lang$core$Native_List.Nil; |
| } |
| |
| var i = 0; |
| var is = []; |
| |
| while ((i = str.indexOf(sub, i)) > -1) |
| { |
| is.push(i); |
| i = i + subLen; |
| } |
| |
| return _elm_lang$core$Native_List.fromArray(is); |
| } |
| |
| function toInt(s) |
| { |
| var len = s.length; |
| if (len === 0) |
| { |
| return _elm_lang$core$Result$Err("could not convert string '" + s + "' to an Int" ); |
| } |
| var start = 0; |
| if (s[0] === '-') |
| { |
| if (len === 1) |
| { |
| return _elm_lang$core$Result$Err("could not convert string '" + s + "' to an Int" ); |
| } |
| start = 1; |
| } |
| for (var i = start; i < len; ++i) |
| { |
| var c = s[i]; |
| if (c < '0' || '9' < c) |
| { |
| return _elm_lang$core$Result$Err("could not convert string '" + s + "' to an Int" ); |
| } |
| } |
| return _elm_lang$core$Result$Ok(parseInt(s, 10)); |
| } |
| |
| function toFloat(s) |
| { |
| var len = s.length; |
| if (len === 0) |
| { |
| return _elm_lang$core$Result$Err("could not convert string '" + s + "' to a Float" ); |
| } |
| var start = 0; |
| if (s[0] === '-') |
| { |
| if (len === 1) |
| { |
| return _elm_lang$core$Result$Err("could not convert string '" + s + "' to a Float" ); |
| } |
| start = 1; |
| } |
| var dotCount = 0; |
| for (var i = start; i < len; ++i) |
| { |
| var c = s[i]; |
| if ('0' <= c && c <= '9') |
| { |
| continue; |
| } |
| if (c === '.') |
| { |
| dotCount += 1; |
| if (dotCount <= 1) |
| { |
| continue; |
| } |
| } |
| return _elm_lang$core$Result$Err("could not convert string '" + s + "' to a Float" ); |
| } |
| return _elm_lang$core$Result$Ok(parseFloat(s)); |
| } |
| |
| function toList(str) |
| { |
| return _elm_lang$core$Native_List.fromArray(str.split('').map(_elm_lang$core$Native_Utils.chr)); |
| } |
| function fromList(chars) |
| { |
| return _elm_lang$core$Native_List.toArray(chars).join(''); |
| } |
| |
| return { |
| 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), |
| |
| slice: F3(slice), |
| 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 |
| }; |
| |
| }(); |
| |
| //import Native.Utils // |
| |
| var _elm_lang$core$Native_Char = function() { |
| |
| return { |
| fromCode: function(c) { return _elm_lang$core$Native_Utils.chr(String.fromCharCode(c)); }, |
| toCode: function(c) { return c.charCodeAt(0); }, |
| toUpper: function(c) { return _elm_lang$core$Native_Utils.chr(c.toUpperCase()); }, |
| toLower: function(c) { return _elm_lang$core$Native_Utils.chr(c.toLowerCase()); }, |
| toLocaleUpper: function(c) { return _elm_lang$core$Native_Utils.chr(c.toLocaleUpperCase()); }, |
| toLocaleLower: function(c) { return _elm_lang$core$Native_Utils.chr(c.toLocaleLowerCase()); } |
| }; |
| |
| }(); |
| var _elm_lang$core$Char$fromCode = _elm_lang$core$Native_Char.fromCode; |
| var _elm_lang$core$Char$toCode = _elm_lang$core$Native_Char.toCode; |
| var _elm_lang$core$Char$toLocaleLower = _elm_lang$core$Native_Char.toLocaleLower; |
| var _elm_lang$core$Char$toLocaleUpper = _elm_lang$core$Native_Char.toLocaleUpper; |
| var _elm_lang$core$Char$toLower = _elm_lang$core$Native_Char.toLower; |
| var _elm_lang$core$Char$toUpper = _elm_lang$core$Native_Char.toUpper; |
| var _elm_lang$core$Char$isBetween = F3( |
| function (low, high, $char) { |
| var code = _elm_lang$core$Char$toCode($char); |
| return (_elm_lang$core$Native_Utils.cmp( |
| code, |
| _elm_lang$core$Char$toCode(low)) > -1) && (_elm_lang$core$Native_Utils.cmp( |
| code, |
| _elm_lang$core$Char$toCode(high)) < 1); |
| }); |
| var _elm_lang$core$Char$isUpper = A2( |
| _elm_lang$core$Char$isBetween, |
| _elm_lang$core$Native_Utils.chr('A'), |
| _elm_lang$core$Native_Utils.chr('Z')); |
| var _elm_lang$core$Char$isLower = A2( |
| _elm_lang$core$Char$isBetween, |
| _elm_lang$core$Native_Utils.chr('a'), |
| _elm_lang$core$Native_Utils.chr('z')); |
| var _elm_lang$core$Char$isDigit = A2( |
| _elm_lang$core$Char$isBetween, |
| _elm_lang$core$Native_Utils.chr('0'), |
| _elm_lang$core$Native_Utils.chr('9')); |
| var _elm_lang$core$Char$isOctDigit = A2( |
| _elm_lang$core$Char$isBetween, |
| _elm_lang$core$Native_Utils.chr('0'), |
| _elm_lang$core$Native_Utils.chr('7')); |
| var _elm_lang$core$Char$isHexDigit = function ($char) { |
| return _elm_lang$core$Char$isDigit($char) || (A3( |
| _elm_lang$core$Char$isBetween, |
| _elm_lang$core$Native_Utils.chr('a'), |
| _elm_lang$core$Native_Utils.chr('f'), |
| $char) || A3( |
| _elm_lang$core$Char$isBetween, |
| _elm_lang$core$Native_Utils.chr('A'), |
| _elm_lang$core$Native_Utils.chr('F'), |
| $char)); |
| }; |
| |
| var _elm_lang$core$String$fromList = _elm_lang$core$Native_String.fromList; |
| var _elm_lang$core$String$toList = _elm_lang$core$Native_String.toList; |
| var _elm_lang$core$String$toFloat = _elm_lang$core$Native_String.toFloat; |
| var _elm_lang$core$String$toInt = _elm_lang$core$Native_String.toInt; |
| var _elm_lang$core$String$indices = _elm_lang$core$Native_String.indexes; |
| var _elm_lang$core$String$indexes = _elm_lang$core$Native_String.indexes; |
| var _elm_lang$core$String$endsWith = _elm_lang$core$Native_String.endsWith; |
| var _elm_lang$core$String$startsWith = _elm_lang$core$Native_String.startsWith; |
| var _elm_lang$core$String$contains = _elm_lang$core$Native_String.contains; |
| var _elm_lang$core$String$all = _elm_lang$core$Native_String.all; |
| var _elm_lang$core$String$any = _elm_lang$core$Native_String.any; |
| var _elm_lang$core$String$toLower = _elm_lang$core$Native_String.toLower; |
| var _elm_lang$core$String$toUpper = _elm_lang$core$Native_String.toUpper; |
| var _elm_lang$core$String$lines = _elm_lang$core$Native_String.lines; |
| var _elm_lang$core$String$words = _elm_lang$core$Native_String.words; |
| var _elm_lang$core$String$trimRight = _elm_lang$core$Native_String.trimRight; |
| var _elm_lang$core$String$trimLeft = _elm_lang$core$Native_String.trimLeft; |
| var _elm_lang$core$String$trim = _elm_lang$core$Native_String.trim; |
| var _elm_lang$core$String$padRight = _elm_lang$core$Native_String.padRight; |
| var _elm_lang$core$String$padLeft = _elm_lang$core$Native_String.padLeft; |
| var _elm_lang$core$String$pad = _elm_lang$core$Native_String.pad; |
| var _elm_lang$core$String$dropRight = _elm_lang$core$Native_String.dropRight; |
| var _elm_lang$core$String$dropLeft = _elm_lang$core$Native_String.dropLeft; |
| var _elm_lang$core$String$right = _elm_lang$core$Native_String.right; |
| var _elm_lang$core$String$left = _elm_lang$core$Native_String.left; |
| var _elm_lang$core$String$slice = _elm_lang$core$Native_String.slice; |
| var _elm_lang$core$String$repeat = _elm_lang$core$Native_String.repeat; |
| var _elm_lang$core$String$join = _elm_lang$core$Native_String.join; |
| var _elm_lang$core$String$split = _elm_lang$core$Native_String.split; |
| var _elm_lang$core$String$foldr = _elm_lang$core$Native_String.foldr; |
| var _elm_lang$core$String$foldl = _elm_lang$core$Native_String.foldl; |
| var _elm_lang$core$String$reverse = _elm_lang$core$Native_String.reverse; |
| var _elm_lang$core$String$filter = _elm_lang$core$Native_String.filter; |
| var _elm_lang$core$String$map = _elm_lang$core$Native_String.map; |
| var _elm_lang$core$String$length = _elm_lang$core$Native_String.length; |
| var _elm_lang$core$String$concat = _elm_lang$core$Native_String.concat; |
| var _elm_lang$core$String$append = _elm_lang$core$Native_String.append; |
| var _elm_lang$core$String$uncons = _elm_lang$core$Native_String.uncons; |
| var _elm_lang$core$String$cons = _elm_lang$core$Native_String.cons; |
| var _elm_lang$core$String$fromChar = function ($char) { |
| return A2(_elm_lang$core$String$cons, $char, ''); |
| }; |
| var _elm_lang$core$String$isEmpty = _elm_lang$core$Native_String.isEmpty; |
| |
| //import Maybe, Native.List // |
| |
| var _elm_lang$core$Native_Regex = function() { |
| |
| function escape(str) |
| { |
| return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); |
| } |
| function caseInsensitive(re) |
| { |
| return new RegExp(re.source, 'gi'); |
| } |
| function regex(raw) |
| { |
| return new RegExp(raw, 'g'); |
| } |
| |
| function contains(re, string) |
| { |
| return string.match(re) !== null; |
| } |
| |
| function find(n, re, str) |
| { |
| n = n.ctor === 'All' ? Infinity : n._0; |
| var out = []; |
| var number = 0; |
| var string = str; |
| var lastIndex = re.lastIndex; |
| var prevLastIndex = -1; |
| var result; |
| while (number++ < n && (result = re.exec(string))) |
| { |
| if (prevLastIndex === re.lastIndex) break; |
| var i = result.length - 1; |
| var subs = new Array(i); |
| while (i > 0) |
| { |
| var submatch = result[i]; |
| subs[--i] = submatch === undefined |
| ? _elm_lang$core$Maybe$Nothing |
| : _elm_lang$core$Maybe$Just(submatch); |
| } |
| out.push({ |
| match: result[0], |
| submatches: _elm_lang$core$Native_List.fromArray(subs), |
| index: result.index, |
| number: number |
| }); |
| prevLastIndex = re.lastIndex; |
| } |
| re.lastIndex = lastIndex; |
| return _elm_lang$core$Native_List.fromArray(out); |
| } |
| |
| function replace(n, re, replacer, string) |
| { |
| n = n.ctor === 'All' ? Infinity : n._0; |
| var count = 0; |
| function jsReplacer(match) |
| { |
| if (count++ >= n) |
| { |
| return match; |
| } |
| var i = arguments.length - 3; |
| var submatches = new Array(i); |
| while (i > 0) |
| { |
| var submatch = arguments[i]; |
| submatches[--i] = submatch === undefined |
| ? _elm_lang$core$Maybe$Nothing |
| : _elm_lang$core$Maybe$Just(submatch); |
| } |
| return replacer({ |
| match: match, |
| submatches: _elm_lang$core$Native_List.fromArray(submatches), |
| index: arguments[i - 1], |
| number: count |
| }); |
| } |
| return string.replace(re, jsReplacer); |
| } |
| |
| function split(n, re, str) |
| { |
| n = n.ctor === 'All' ? Infinity : n._0; |
| if (n === Infinity) |
| { |
| return _elm_lang$core$Native_List.fromArray(str.split(re)); |
| } |
| var string = str; |
| var result; |
| var out = []; |
| var start = re.lastIndex; |
| while (n--) |
| { |
| if (!(result = re.exec(string))) break; |
| out.push(string.slice(start, result.index)); |
| start = re.lastIndex; |
| } |
| out.push(string.slice(start)); |
| return _elm_lang$core$Native_List.fromArray(out); |
| } |
| |
| return { |
| regex: regex, |
| caseInsensitive: caseInsensitive, |
| escape: escape, |
| |
| contains: F2(contains), |
| find: F3(find), |
| replace: F4(replace), |
| split: F3(split) |
| }; |
| |
| }(); |
| |
| var _elm_lang$core$Regex$split = _elm_lang$core$Native_Regex.split; |
| var _elm_lang$core$Regex$replace = _elm_lang$core$Native_Regex.replace; |
| var _elm_lang$core$Regex$find = _elm_lang$core$Native_Regex.find; |
| var _elm_lang$core$Regex$contains = _elm_lang$core$Native_Regex.contains; |
| var _elm_lang$core$Regex$caseInsensitive = _elm_lang$core$Native_Regex.caseInsensitive; |
| var _elm_lang$core$Regex$regex = _elm_lang$core$Native_Regex.regex; |
| var _elm_lang$core$Regex$escape = _elm_lang$core$Native_Regex.escape; |
| var _elm_lang$core$Regex$Match = F4( |
| function (a, b, c, d) { |
| return {match: a, submatches: b, index: c, number: d}; |
| }); |
| var _elm_lang$core$Regex$Regex = {ctor: 'Regex'}; |
| var _elm_lang$core$Regex$AtMost = function (a) { |
| return {ctor: 'AtMost', _0: a}; |
| }; |
| var _elm_lang$core$Regex$All = {ctor: 'All'}; |
| |
| var _elm_community$string_extra$String_Extra$leftOfBack = F2( |
| function (pattern, string) { |
| return A2( |
| _elm_lang$core$Maybe$withDefault, |
| '', |
| A2( |
| _elm_lang$core$Maybe$map, |
| A2(_elm_lang$core$Basics$flip, _elm_lang$core$String$left, string), |
| _elm_lang$core$List$head( |
| _elm_lang$core$List$reverse( |
| A2(_elm_lang$core$String$indexes, pattern, string))))); |
| }); |
| var _elm_community$string_extra$String_Extra$rightOfBack = F2( |
| function (pattern, string) { |
| return A2( |
| _elm_lang$core$Maybe$withDefault, |
| '', |
| A2( |
| _elm_lang$core$Maybe$map, |
| function (_p0) { |
| return A3( |
| _elm_lang$core$Basics$flip, |
| _elm_lang$core$String$dropLeft, |
| string, |
| A2( |
| F2( |
| function (x, y) { |
| return x + y; |
| }), |
| _elm_lang$core$String$length(pattern), |
| _p0)); |
| }, |
| _elm_lang$core$List$head( |
| _elm_lang$core$List$reverse( |
| A2(_elm_lang$core$String$indexes, pattern, string))))); |
| }); |
| var _elm_community$string_extra$String_Extra$leftOf = F2( |
| function (pattern, string) { |
| return A2( |
| _elm_lang$core$String$join, |
| '', |
| A2( |
| _elm_lang$core$List$map, |
| function (_p1) { |
| return A2( |
| _elm_lang$core$Maybe$withDefault, |
| '', |
| _elm_lang$core$Maybe$oneOf( |
| function (_) { |
| return _.submatches; |
| }(_p1))); |
| }, |
| A3( |
| _elm_lang$core$Regex$find, |
| _elm_lang$core$Regex$AtMost(1), |
| _elm_lang$core$Regex$regex( |
| A2( |
| _elm_lang$core$Basics_ops['++'], |
| '^(.*?)', |
| _elm_lang$core$Regex$escape(pattern))), |
| string))); |
| }); |
| var _elm_community$string_extra$String_Extra$rightOf = F2( |
| function (pattern, string) { |
| return A2( |
| _elm_lang$core$String$join, |
| '', |
| A2( |
| _elm_lang$core$List$map, |
| function (_p2) { |
| return A2( |
| _elm_lang$core$Maybe$withDefault, |
| '', |
| _elm_lang$core$Maybe$oneOf( |
| function (_) { |
| return _.submatches; |
| }(_p2))); |
| }, |
| A3( |
| _elm_lang$core$Regex$find, |
| _elm_lang$core$Regex$AtMost(1), |
| _elm_lang$core$Regex$regex( |
| A2( |
| _elm_lang$core$Basics_ops['++'], |
| _elm_lang$core$Regex$escape(pattern), |
| '(.*)$')), |
| string))); |
| }); |
| var _elm_community$string_extra$String_Extra$stripTags = function (string) { |
| return A4( |
| _elm_lang$core$Regex$replace, |
| _elm_lang$core$Regex$All, |
| _elm_lang$core$Regex$regex('<\\/?[^>]+>'), |
| _elm_lang$core$Basics$always(''), |
| string); |
| }; |
| var _elm_community$string_extra$String_Extra$toSentenceHelper = F3( |
| function (lastPart, sentence, list) { |
| toSentenceHelper: |
| while (true) { |
| var _p3 = list; |
| if (_p3.ctor === '[]') { |
| return sentence; |
| } else { |
| if (_p3._1.ctor === '[]') { |
| return A2( |
| _elm_lang$core$Basics_ops['++'], |
| sentence, |
| A2(_elm_lang$core$Basics_ops['++'], lastPart, _p3._0)); |
| } else { |
| var _v1 = lastPart, |
| _v2 = A2( |
| _elm_lang$core$Basics_ops['++'], |
| sentence, |
| A2(_elm_lang$core$Basics_ops['++'], ', ', _p3._0)), |
| _v3 = _p3._1; |
| lastPart = _v1; |
| sentence = _v2; |
| list = _v3; |
| continue toSentenceHelper; |
| } |
| } |
| } |
| }); |
| var _elm_community$string_extra$String_Extra$toSentenceBaseCase = function (list) { |
| var _p4 = list; |
| _v4_2: |
| do { |
| if (_p4.ctor === '::') { |
| if (_p4._1.ctor === '[]') { |
| return _p4._0; |
| } else { |
| if (_p4._1._1.ctor === '[]') { |
| return A2( |
| _elm_lang$core$Basics_ops['++'], |
| _p4._0, |
| A2(_elm_lang$core$Basics_ops['++'], ' and ', _p4._1._0)); |
| } else { |
| break _v4_2; |
| } |
| } |
| } else { |
| break _v4_2; |
| } |
| } while(false); |
| return ''; |
| }; |
| var _elm_community$string_extra$String_Extra$toSentenceOxford = function (list) { |
| var _p5 = list; |
| if (((_p5.ctor === '::') && (_p5._1.ctor === '::')) && (_p5._1._1.ctor === '::')) { |
| return A3( |
| _elm_community$string_extra$String_Extra$toSentenceHelper, |
| ', and ', |
| A2( |
| _elm_lang$core$Basics_ops['++'], |
| _p5._0, |
| A2(_elm_lang$core$Basics_ops['++'], ', ', _p5._1._0)), |
| A2(_elm_lang$core$List_ops['::'], _p5._1._1._0, _p5._1._1._1)); |
| } else { |
| return _elm_community$string_extra$String_Extra$toSentenceBaseCase(list); |
| } |
| }; |
| var _elm_community$string_extra$String_Extra$toSentence = function (list) { |
| var _p6 = list; |
| if (((_p6.ctor === '::') && (_p6._1.ctor === '::')) && (_p6._1._1.ctor === '::')) { |
| return A3( |
| _elm_community$string_extra$String_Extra$toSentenceHelper, |
| ' and ', |
| A2( |
| _elm_lang$core$Basics_ops['++'], |
| _p6._0, |
| A2(_elm_lang$core$Basics_ops['++'], ', ', _p6._1._0)), |
| A2(_elm_lang$core$List_ops['::'], _p6._1._1._0, _p6._1._1._1)); |
| } else { |
| return _elm_community$string_extra$String_Extra$toSentenceBaseCase(list); |
| } |
| }; |
| var _elm_community$string_extra$String_Extra$ellipsisWith = F3( |
| function (howLong, append, string) { |
| return (_elm_lang$core$Native_Utils.cmp( |
| _elm_lang$core$String$length(string), |
| howLong) < 1) ? string : A2( |
| _elm_lang$core$Basics_ops['++'], |
| A2( |
| _elm_lang$core$String$left, |
| howLong - _elm_lang$core$String$length(append), |
| string), |
| append); |
| }); |
| var _elm_community$string_extra$String_Extra$ellipsis = F2( |
| function (howLong, string) { |
| return A3(_elm_community$string_extra$String_Extra$ellipsisWith, howLong, '...', string); |
| }); |
| var _elm_community$string_extra$String_Extra$countOccurrences = F2( |
| function (needle, haystack) { |
| return (_elm_lang$core$Native_Utils.eq( |
| _elm_lang$core$String$length(needle), |
| 0) || _elm_lang$core$Native_Utils.eq( |
| _elm_lang$core$String$length(haystack), |
| 0)) ? 0 : _elm_lang$core$List$length( |
| A2(_elm_lang$core$String$indexes, needle, haystack)); |
| }); |
| var _elm_community$string_extra$String_Extra$unindent = function (multilineSting) { |
| var isNotWhitespace = function ($char) { |
| return (!_elm_lang$core$Native_Utils.eq( |
| $char, |
| _elm_lang$core$Native_Utils.chr(' '))) && (!_elm_lang$core$Native_Utils.eq( |
| $char, |
| _elm_lang$core$Native_Utils.chr('\t'))); |
| }; |
| var countLeadingWhitespace = F2( |
| function (count, line) { |
| countLeadingWhitespace: |
| while (true) { |
| var _p7 = _elm_lang$core$String$uncons(line); |
| if (_p7.ctor === 'Nothing') { |
| return count; |
| } else { |
| var _p9 = _p7._0._1; |
| var _p8 = _p7._0._0; |
| switch (_p8.valueOf()) { |
| case ' ': |
| var _v9 = count + 1, |
| _v10 = _p9; |
| count = _v9; |
| line = _v10; |
| continue countLeadingWhitespace; |
| case '\t': |
| var _v11 = count + 1, |
| _v12 = _p9; |
| count = _v11; |
| line = _v12; |
| continue countLeadingWhitespace; |
| default: |
| return count; |
| } |
| } |
| } |
| }); |
| var lines = _elm_lang$core$String$lines(multilineSting); |
| var minLead = A2( |
| _elm_lang$core$Maybe$withDefault, |
| 0, |
| _elm_lang$core$List$minimum( |
| A2( |
| _elm_lang$core$List$map, |
| countLeadingWhitespace(0), |
| A2( |
| _elm_lang$core$List$filter, |
| _elm_lang$core$String$any(isNotWhitespace), |
| lines)))); |
| return A2( |
| _elm_lang$core$String$join, |
| '\n', |
| A2( |
| _elm_lang$core$List$map, |
| _elm_lang$core$String$dropLeft(minLead), |
| lines)); |
| }; |
| var _elm_community$string_extra$String_Extra$dasherize = function (string) { |
| return _elm_lang$core$String$toLower( |
| A4( |
| _elm_lang$core$Regex$replace, |
| _elm_lang$core$Regex$All, |
| _elm_lang$core$Regex$regex('[_-\\s]+'), |
| _elm_lang$core$Basics$always('-'), |
| A4( |
| _elm_lang$core$Regex$replace, |
| _elm_lang$core$Regex$All, |
| _elm_lang$core$Regex$regex('([A-Z])'), |
| function (_p10) { |
| return A2( |
| _elm_lang$core$String$append, |
| '-', |
| function (_) { |
| return _.match; |
| }(_p10)); |
| }, |
| _elm_lang$core$String$trim(string)))); |
| }; |
| var _elm_community$string_extra$String_Extra$underscored = function (string) { |
| return _elm_lang$core$String$toLower( |
| A4( |
| _elm_lang$core$Regex$replace, |
| _elm_lang$core$Regex$All, |
| _elm_lang$core$Regex$regex('[_-\\s]+'), |
| _elm_lang$core$Basics$always('_'), |
| A4( |
| _elm_lang$core$Regex$replace, |
| _elm_lang$core$Regex$All, |
| _elm_lang$core$Regex$regex('([a-z\\d])([A-Z]+)'), |
| function (_p11) { |
| return A2( |
| _elm_lang$core$String$join, |
| '_', |
| A2( |
| _elm_lang$core$List$filterMap, |
| _elm_lang$core$Basics$identity, |
| function (_) { |
| return _.submatches; |
| }(_p11))); |
| }, |
| _elm_lang$core$String$trim(string)))); |
| }; |
| var _elm_community$string_extra$String_Extra$unsurround = F2( |
| function (wrap, string) { |
| if (A2(_elm_lang$core$String$startsWith, wrap, string) && A2(_elm_lang$core$String$endsWith, wrap, string)) { |
| var length = _elm_lang$core$String$length(wrap); |
| return A2( |
| _elm_lang$core$String$dropRight, |
| length, |
| A2(_elm_lang$core$String$dropLeft, length, string)); |
| } else { |
| return string; |
| } |
| }); |
| var _elm_community$string_extra$String_Extra$unquote = function (string) { |
| return A2(_elm_community$string_extra$String_Extra$unsurround, '\"', string); |
| }; |
| var _elm_community$string_extra$String_Extra$surround = F2( |
| function (wrap, string) { |
| return A2( |
| _elm_lang$core$Basics_ops['++'], |
| wrap, |
| A2(_elm_lang$core$Basics_ops['++'], string, wrap)); |
| }); |
| var _elm_community$string_extra$String_Extra$quote = function (string) { |
| return A2(_elm_community$string_extra$String_Extra$surround, '\"', string); |
| }; |
| var _elm_community$string_extra$String_Extra$camelize = function (string) { |
| return A4( |
| _elm_lang$core$Regex$replace, |
| _elm_lang$core$Regex$All, |
| _elm_lang$core$Regex$regex('[-_\\s]+(.)?'), |
| function (_p12) { |
| var _p13 = _p12; |
| var _p14 = _p13.submatches; |
| if ((_p14.ctor === '::') && (_p14._0.ctor === 'Just')) { |
| return _elm_lang$core$String$toUpper(_p14._0._0); |
| } else { |
| return ''; |
| } |
| }, |
| _elm_lang$core$String$trim(string)); |
| }; |
| var _elm_community$string_extra$String_Extra$isBlank = function (string) { |
| return A2( |
| _elm_lang$core$Regex$contains, |
| _elm_lang$core$Regex$regex('^\\s*$'), |
| string); |
| }; |
| var _elm_community$string_extra$String_Extra$clean = function (string) { |
| return _elm_lang$core$String$trim( |
| A4( |
| _elm_lang$core$Regex$replace, |
| _elm_lang$core$Regex$All, |
| _elm_lang$core$Regex$regex('\\s\\s+'), |
| _elm_lang$core$Basics$always(' '), |
| string)); |
| }; |
| var _elm_community$string_extra$String_Extra$softBreakRegexp = function (width) { |
| return _elm_lang$core$Regex$regex( |
| A2( |
| _elm_lang$core$Basics_ops['++'], |
| '.{1,', |
| A2( |
| _elm_lang$core$Basics_ops['++'], |
| _elm_lang$core$Basics$toString(width), |
| '}(\\s|$)|\\S+?(\\s|$)'))); |
| }; |
| var _elm_community$string_extra$String_Extra$softEllipsis = F2( |
| function (howLong, string) { |
| return (_elm_lang$core$Native_Utils.cmp( |
| _elm_lang$core$String$length(string), |
| howLong) < 1) ? string : A3( |
| _elm_lang$core$Basics$flip, |
| _elm_lang$core$String$append, |
| '...', |
| A4( |
| _elm_lang$core$Regex$replace, |
| _elm_lang$core$Regex$All, |
| _elm_lang$core$Regex$regex('([\\.,;:\\s])+$'), |
| _elm_lang$core$Basics$always(''), |
| A2( |
| _elm_lang$core$String$join, |
| '', |
| A2( |
| _elm_lang$core$List$map, |
| function (_) { |
| return _.match; |
| }, |
| A3( |
| _elm_lang$core$Regex$find, |
| _elm_lang$core$Regex$AtMost(1), |
| _elm_community$string_extra$String_Extra$softBreakRegexp(howLong), |
| string))))); |
| }); |
| var _elm_community$string_extra$String_Extra$softBreak = F2( |
| function (width, string) { |
| return (_elm_lang$core$Native_Utils.cmp(width, 0) < 1) ? _elm_lang$core$Native_List.fromArray( |
| []) : A2( |
| _elm_lang$core$List$map, |
| function (_) { |
| return _.match; |
| }, |
| A3( |
| _elm_lang$core$Regex$find, |
| _elm_lang$core$Regex$All, |
| _elm_community$string_extra$String_Extra$softBreakRegexp(width), |
| string)); |
| }); |
| var _elm_community$string_extra$String_Extra$softWrapWith = F3( |
| function (width, separator, string) { |
| return A2( |
| _elm_lang$core$String$join, |
| separator, |
| A2(_elm_community$string_extra$String_Extra$softBreak, width, string)); |
| }); |
| var _elm_community$string_extra$String_Extra$softWrap = F2( |
| function (width, string) { |
| return A3(_elm_community$string_extra$String_Extra$softWrapWith, width, '\n', string); |
| }); |
| var _elm_community$string_extra$String_Extra$breaker = F3( |
| function (width, string, acc) { |
| breaker: |
| while (true) { |
| var _p15 = string; |
| if (_p15 === '') { |
| return _elm_lang$core$List$reverse(acc); |
| } else { |
| var _v16 = width, |
| _v17 = A2(_elm_lang$core$String$dropLeft, width, string), |
| _v18 = A2( |
| _elm_lang$core$List_ops['::'], |
| A3(_elm_lang$core$String$slice, 0, width, string), |
| acc); |
| width = _v16; |
| string = _v17; |
| acc = _v18; |
| continue breaker; |
| } |
| } |
| }); |
| var _elm_community$string_extra$String_Extra$break = F2( |
| function (width, string) { |
| return (_elm_lang$core$Native_Utils.eq(width, 0) || _elm_lang$core$Native_Utils.eq(string, '')) ? _elm_lang$core$Native_List.fromArray( |
| [string]) : A3( |
| _elm_community$string_extra$String_Extra$breaker, |
| width, |
| string, |
| _elm_lang$core$Native_List.fromArray( |
| [])); |
| }); |
| var _elm_community$string_extra$String_Extra$wrapWith = F3( |
| function (width, separator, string) { |
| return A2( |
| _elm_lang$core$String$join, |
| separator, |
| A2(_elm_community$string_extra$String_Extra$break, width, string)); |
| }); |
| var _elm_community$string_extra$String_Extra$wrap = F2( |
| function (width, string) { |
| return A3(_elm_community$string_extra$String_Extra$wrapWith, width, '\n', string); |
| }); |
| var _elm_community$string_extra$String_Extra$replaceSlice = F4( |
| function (substitution, start, end, string) { |
| return A2( |
| _elm_lang$core$Basics_ops['++'], |
| A3(_elm_lang$core$String$slice, 0, start, string), |
| A2( |
| _elm_lang$core$Basics_ops['++'], |
| substitution, |
| A3( |
| _elm_lang$core$String$slice, |
| end, |
| _elm_lang$core$String$length(string), |
| string))); |
| }); |
| var _elm_community$string_extra$String_Extra$insertAt = F3( |
| function (insert, pos, string) { |
| return A4(_elm_community$string_extra$String_Extra$replaceSlice, insert, pos, pos, string); |
| }); |
| var _elm_community$string_extra$String_Extra$replace = F3( |
| function (search, substitution, string) { |
| return A4( |
| _elm_lang$core$Regex$replace, |
| _elm_lang$core$Regex$All, |
| _elm_lang$core$Regex$regex( |
| _elm_lang$core$Regex$escape(search)), |
| function (_p16) { |
| return substitution; |
| }, |
| string); |
| }); |
| var _elm_community$string_extra$String_Extra$changeCase = F2( |
| function (mutator, word) { |
| return A2( |
| _elm_lang$core$Maybe$withDefault, |
| '', |
| A2( |
| _elm_lang$core$Maybe$map, |
| function (_p17) { |
| var _p18 = _p17; |
| return A2( |
| _elm_lang$core$String$cons, |
| mutator(_p18._0), |
| _p18._1); |
| }, |
| _elm_lang$core$String$uncons(word))); |
| }); |
| var _elm_community$string_extra$String_Extra$toSentenceCase = function (word) { |
| return A2(_elm_community$string_extra$String_Extra$changeCase, _elm_lang$core$Char$toUpper, word); |
| }; |
| var _elm_community$string_extra$String_Extra$toTitleCase = function (ws) { |
| var uppercaseMatch = A3( |
| _elm_lang$core$Regex$replace, |
| _elm_lang$core$Regex$All, |
| _elm_lang$core$Regex$regex('\\w+'), |
| function (_p19) { |
| return _elm_community$string_extra$String_Extra$toSentenceCase( |
| function (_) { |
| return _.match; |
| }(_p19)); |
| }); |
| return A4( |
| _elm_lang$core$Regex$replace, |
| _elm_lang$core$Regex$All, |
| _elm_lang$core$Regex$regex('^([a-z])|\\s+([a-z])'), |
| function (_p20) { |
| return uppercaseMatch( |
| function (_) { |
| return _.match; |
| }(_p20)); |
| }, |
| ws); |
| }; |
| var _elm_community$string_extra$String_Extra$classify = function (string) { |
| return _elm_community$string_extra$String_Extra$toSentenceCase( |
| A3( |
| _elm_community$string_extra$String_Extra$replace, |
| ' ', |
| '', |
| _elm_community$string_extra$String_Extra$camelize( |
| A4( |
| _elm_lang$core$Regex$replace, |
| _elm_lang$core$Regex$All, |
| _elm_lang$core$Regex$regex('[\\W_]'), |
| _elm_lang$core$Basics$always(' '), |
| string)))); |
| }; |
| var _elm_community$string_extra$String_Extra$humanize = function (string) { |
| return _elm_community$string_extra$String_Extra$toSentenceCase( |
| _elm_lang$core$String$toLower( |
| _elm_lang$core$String$trim( |
| A4( |
| _elm_lang$core$Regex$replace, |
| _elm_lang$core$Regex$All, |
| _elm_lang$core$Regex$regex('_id$|[-_\\s]+'), |
| _elm_lang$core$Basics$always(' '), |
| A4( |
| _elm_lang$core$Regex$replace, |
| _elm_lang$core$Regex$All, |
| _elm_lang$core$Regex$regex('[A-Z]'), |
| function (_p21) { |
| return A2( |
| _elm_lang$core$String$append, |
| '-', |
| function (_) { |
| return _.match; |
| }(_p21)); |
| }, |
| string))))); |
| }; |
| var _elm_community$string_extra$String_Extra$decapitalize = function (word) { |
| return A2(_elm_community$string_extra$String_Extra$changeCase, _elm_lang$core$Char$toLower, word); |
| }; |
| |
| //import Native.List // |
| |
| var _elm_lang$core$Native_Array = function() { |
| |
| // A RRB-Tree has two distinct data types. |
| // Leaf -> "height" is always 0 |
| // "table" is an array of elements |
| // Node -> "height" is always greater than 0 |
| // "table" is an array of child nodes |
| // "lengths" is an array of accumulated lengths of the child nodes |
| |
| // M is the maximal table size. 32 seems fast. E is the allowed increase |
| // of search steps when concatting to find an index. Lower values will |
| // decrease balancing, but will increase search steps. |
| var M = 32; |
| var E = 2; |
| |
| // An empty array. |
| var empty = { |
| ctor: '_Array', |
| height: 0, |
| table: [] |
| }; |
| |
| |
| function get(i, array) |
| { |
| if (i < 0 || i >= length(array)) |
| { |
| throw new Error( |
| 'Index ' + i + ' is out of range. Check the length of ' + |
| 'your array first or use getMaybe or getWithDefault.'); |
| } |
| return unsafeGet(i, array); |
| } |
| |
| |
| function unsafeGet(i, array) |
| { |
| for (var x = array.height; x > 0; x--) |
| { |
| var slot = i >> (x * 5); |
| while (array.lengths[slot] <= i) |
| { |
| slot++; |
| } |
| if (slot > 0) |
| { |
| i -= array.lengths[slot - 1]; |
| } |
| array = array.table[slot]; |
| } |
| return array.table[i]; |
| } |
| |
| |
| // Sets the value at the index i. Only the nodes leading to i will get |
| // copied and updated. |
| function set(i, item, array) |
| { |
| if (i < 0 || length(array) <= i) |
| { |
| return array; |
| } |
| return unsafeSet(i, item, array); |
| } |
| |
| |
| function unsafeSet(i, item, array) |
| { |
| array = nodeCopy(array); |
| |
| if (array.height === 0) |
| { |
| array.table[i] = item; |
| } |
| else |
| { |
| var slot = getSlot(i, array); |
| if (slot > 0) |
| { |
| i -= array.lengths[slot - 1]; |
| } |
| array.table[slot] = unsafeSet(i, item, array.table[slot]); |
| } |
| return array; |
| } |
| |
| |
| function initialize(len, f) |
| { |
| if (len <= 0) |
| { |
| return empty; |
| } |
| var h = Math.floor( Math.log(len) / Math.log(M) ); |
| return initialize_(f, h, 0, len); |
| } |
| |
| function initialize_(f, h, from, to) |
| { |
| if (h === 0) |
| { |
| var table = new Array((to - from) % (M + 1)); |
| for (var i = 0; i < table.length; i++) |
| { |
| table[i] = f(from + i); |
| } |
| return { |
| ctor: '_Array', |
| height: 0, |
| table: table |
| }; |
| } |
| |
| var step = Math.pow(M, h); |
| var table = new Array(Math.ceil((to - from) / step)); |
| var lengths = new Array(table.length); |
| for (var i = 0; i < table.length; i++) |
| { |
| table[i] = initialize_(f, h - 1, from + (i * step), Math.min(from + ((i + 1) * step), to)); |
| lengths[i] = length(table[i]) + (i > 0 ? lengths[i-1] : 0); |
| } |
| return { |
| ctor: '_Array', |
| height: h, |
| table: table, |
| lengths: lengths |
| }; |
| } |
| |
| function fromList(list) |
| { |
| if (list.ctor === '[]') |
| { |
| return empty; |
| } |
| |
| // Allocate M sized blocks (table) and write list elements to it. |
| var table = new Array(M); |
| var nodes = []; |
| var i = 0; |
| |
| while (list.ctor !== '[]') |
| { |
| table[i] = list._0; |
| list = list._1; |
| i++; |
| |
| // table is full, so we can push a leaf containing it into the |
| // next node. |
| if (i === M) |
| { |
| var leaf = { |
| ctor: '_Array', |
| height: 0, |
| table: table |
| }; |
| fromListPush(leaf, nodes); |
| table = new Array(M); |
| i = 0; |
| } |
| } |
| |
| // Maybe there is something left on the table. |
| if (i > 0) |
| { |
| var leaf = { |
| ctor: '_Array', |
| height: 0, |
| table: table.splice(0, i) |
| }; |
| fromListPush(leaf, nodes); |
| } |
| |
| // Go through all of the nodes and eventually push them into higher nodes. |
| for (var h = 0; h < nodes.length - 1; h++) |
| { |
| if (nodes[h].table.length > 0) |
| { |
| fromListPush(nodes[h], nodes); |
| } |
| } |
| |
| var head = nodes[nodes.length - 1]; |
| if (head.height > 0 && head.table.length === 1) |
| { |
| return head.table[0]; |
| } |
| else |
| { |
| return head; |
| } |
| } |
| |
| // Push a node into a higher node as a child. |
| function fromListPush(toPush, nodes) |
| { |
| var h = toPush.height; |
| |
| // Maybe the node on this height does not exist. |
| if (nodes.length === h) |
| { |
| var node = { |
| ctor: '_Array', |
| height: h + 1, |
| table: [], |
| lengths: [] |
| }; |
| nodes.push(node); |
| } |
| |
| nodes[h].table.push(toPush); |
| var len = length(toPush); |
| if (nodes[h].lengths.length > 0) |
| { |
| len += nodes[h].lengths[nodes[h].lengths.length - 1]; |
| } |
| nodes[h].lengths.push(len); |
| |
| if (nodes[h].table.length === M) |
| { |
| fromListPush(nodes[h], nodes); |
| nodes[h] = { |
| ctor: '_Array', |
| height: h + 1, |
| table: [], |
| lengths: [] |
| }; |
| } |
| } |
| |
| // Pushes an item via push_ to the bottom right of a tree. |
| function push(item, a) |
| { |
| var pushed = push_(item, a); |
| if (pushed !== null) |
| { |
| return pushed; |
| } |
| |
| var newTree = create(item, a.height); |
| return siblise(a, newTree); |
| } |
| |
| // Recursively tries to push an item to the bottom-right most |
| // tree possible. If there is no space left for the item, |
| // null will be returned. |
| function push_(item, a) |
| { |
| // Handle resursion stop at leaf level. |
| if (a.height === 0) |
| { |
| if (a.table.length < M) |
| { |
| var newA = { |
| ctor: '_Array', |
| height: 0, |
| table: a.table.slice() |
| }; |
| newA.table.push(item); |
| return newA; |
| } |
| else |
| { |
| return null; |
| } |
| } |
| |
| // Recursively push |
| var pushed = push_(item, botRight(a)); |
| |
| // There was space in the bottom right tree, so the slot will |
| // be updated. |
| if (pushed !== null) |
| { |
| var newA = nodeCopy(a); |
| newA.table[newA.table.length - 1] = pushed; |
| newA.lengths[newA.lengths.length - 1]++; |
| return newA; |
| } |
| |
| // When there was no space left, check if there is space left |
| // for a new slot with a tree which contains only the item |
| // at the bottom. |
| if (a.table.length < M) |
| { |
| var newSlot = create(item, a.height - 1); |
| var newA = nodeCopy(a); |
| newA.table.push(newSlot); |
| newA.lengths.push(newA.lengths[newA.lengths.length - 1] + length(newSlot)); |
| return newA; |
| } |
| else |
| { |
| return null; |
| } |
| } |
| |
| // Converts an array into a list of elements. |
| function toList(a) |
| { |
| return toList_(_elm_lang$core$Native_List.Nil, a); |
| } |
| |
| function toList_(list, a) |
| { |
| for (var i = a.table.length - 1; i >= 0; i--) |
| { |
| list = |
| a.height === 0 |
| ? _elm_lang$core$Native_List.Cons(a.table[i], list) |
| : toList_(list, a.table[i]); |
| } |
| return list; |
| } |
| |
| // Maps a function over the elements of an array. |
| function map(f, a) |
| { |
| var newA = { |
| ctor: '_Array', |
| height: a.height, |
| table: new Array(a.table.length) |
| }; |
| if (a.height > 0) |
| { |
| newA.lengths = a.lengths; |
| } |
| for (var i = 0; i < a.table.length; i++) |
| { |
| newA.table[i] = |
| a.height === 0 |
| ? f(a.table[i]) |
| : map(f, a.table[i]); |
| } |
| return newA; |
| } |
| |
| // Maps a function over the elements with their index as first argument. |
| function indexedMap(f, a) |
| { |
| return indexedMap_(f, a, 0); |
| } |
| |
| function indexedMap_(f, a, from) |
| { |
| var newA = { |
| ctor: '_Array', |
| height: a.height, |
| table: new Array(a.table.length) |
| }; |
| if (a.height > 0) |
| { |
| newA.lengths = a.lengths; |
| } |
| for (var i = 0; i < a.table.length; i++) |
| { |
| newA.table[i] = |
| a.height === 0 |
| ? A2(f, from + i, a.table[i]) |
| : indexedMap_(f, a.table[i], i == 0 ? from : from + a.lengths[i - 1]); |
| } |
| return newA; |
| } |
| |
| function foldl(f, b, a) |
| { |
| if (a.height === 0) |
| { |
| for (var i = 0; i < a.table.length; i++) |
| { |
| b = A2(f, a.table[i], b); |
| } |
| } |
| else |
| { |
| for (var i = 0; i < a.table.length; i++) |
| { |
| b = foldl(f, b, a.table[i]); |
| } |
| } |
| return b; |
| } |
| |
| function foldr(f, b, a) |
| { |
| if (a.height === 0) |
| { |
| for (var i = a.table.length; i--; ) |
| { |
| b = A2(f, a.table[i], b); |
| } |
| } |
| else |
| { |
| for (var i = a.table.length; i--; ) |
| { |
| b = foldr(f, b, a.table[i]); |
| } |
| } |
| return b; |
| } |
| |
| // TODO: currently, it slices the right, then the left. This can be |
| // optimized. |
| function slice(from, to, a) |
| { |
| if (from < 0) |
| { |
| from += length(a); |
| } |
| if (to < 0) |
| { |
| to += length(a); |
| } |
| return sliceLeft(from, sliceRight(to, a)); |
| } |
| |
| function sliceRight(to, a) |
| { |
| if (to === length(a)) |
| { |
| return a; |
| } |
| |
| // Handle leaf level. |
| if (a.height === 0) |
| { |
| var newA = { ctor:'_Array', height:0 }; |
| newA.table = a.table.slice(0, to); |
| return newA; |
| } |
| |
| // Slice the right recursively. |
| var right = getSlot(to, a); |
| var sliced = sliceRight(to - (right > 0 ? a.lengths[right - 1] : 0), a.table[right]); |
| |
| // Maybe the a node is not even needed, as sliced contains the whole slice. |
| if (right === 0) |
| { |
| return sliced; |
| } |
| |
| // Create new node. |
| var newA = { |
| ctor: '_Array', |
| height: a.height, |
| table: a.table.slice(0, right), |
| lengths: a.lengths.slice(0, right) |
| }; |
| if (sliced.table.length > 0) |
| { |
| newA.table[right] = sliced; |
| newA.lengths[right] = length(sliced) + (right > 0 ? newA.lengths[right - 1] : 0); |
| } |
| return newA; |
| } |
| |
| function sliceLeft(from, a) |
| { |
| if (from === 0) |
| { |
| return a; |
| } |
| |
| // Handle leaf level. |
| if (a.height === 0) |
| { |
| var newA = { ctor:'_Array', height:0 }; |
| newA.table = a.table.slice(from, a.table.length + 1); |
| return newA; |
| } |
| |
| // Slice the left recursively. |
| var left = getSlot(from, a); |
| var sliced = sliceLeft(from - (left > 0 ? a.lengths[left - 1] : 0), a.table[left]); |
| |
| // Maybe the a node is not even needed, as sliced contains the whole slice. |
| if (left === a.table.length - 1) |
| { |
| return sliced; |
| } |
| |
| // Create new node. |
| var newA = { |
| ctor: '_Array', |
| height: a.height, |
| table: a.table.slice(left, a.table.length + 1), |
| lengths: new Array(a.table.length - left) |
| }; |
| newA.table[0] = sliced; |
| var len = 0; |
| for (var i = 0; i < newA.table.length; i++) |
| { |
| len += length(newA.table[i]); |
| newA.lengths[i] = len; |
| } |
| |
| return newA; |
| } |
| |
| // Appends two trees. |
| function append(a,b) |
| { |
| if (a.table.length === 0) |
| { |
| return b; |
| } |
| if (b.table.length === 0) |
| { |
| return a; |
| } |
| |
| var c = append_(a, b); |
| |
| // Check if both nodes can be crunshed together. |
| if (c[0].table.length + c[1].table.length <= M) |
| { |
| if (c[0].table.length === 0) |
| { |
| return c[1]; |
| } |
| if (c[1].table.length === 0) |
| { |
| return c[0]; |
| } |
| |
| // Adjust .table and .lengths |
| c[0].table = c[0].table.concat(c[1].table); |
| if (c[0].height > 0) |
| { |
| var len = length(c[0]); |
| for (var i = 0; i < c[1].lengths.length; i++) |
| { |
| c[1].lengths[i] += len; |
| } |
| c[0].lengths = c[0].lengths.concat(c[1].lengths); |
| } |
| |
| return c[0]; |
| } |
| |
| if (c[0].height > 0) |
| { |
| var toRemove = calcToRemove(a, b); |
| if (toRemove > E) |
| { |
| c = shuffle(c[0], c[1], toRemove); |
| } |
| } |
| |
| return siblise(c[0], c[1]); |
| } |
| |
| // Returns an array of two nodes; right and left. One node _may_ be empty. |
| function append_(a, b) |
| { |
| if (a.height === 0 && b.height === 0) |
| { |
| return [a, b]; |
| } |
| |
| if (a.height !== 1 || b.height !== 1) |
| { |
| if (a.height === b.height) |
| { |
| a = nodeCopy(a); |
| b = nodeCopy(b); |
| var appended = append_(botRight(a), botLeft(b)); |
| |
| insertRight(a, appended[1]); |
| insertLeft(b, appended[0]); |
| } |
| else if (a.height > b.height) |
| { |
| a = nodeCopy(a); |
| var appended = append_(botRight(a), b); |
| |
| insertRight(a, appended[0]); |
| b = parentise(appended[1], appended[1].height + 1); |
| } |
| else |
| { |
| b = nodeCopy(b); |
| var appended = append_(a, botLeft(b)); |
| |
| var left = appended[0].table.length === 0 ? 0 : 1; |
| var right = left === 0 ? 1 : 0; |
| insertLeft(b, appended[left]); |
| a = parentise(appended[right], appended[right].height + 1); |
| } |
| } |
| |
| // Check if balancing is needed and return based on that. |
| if (a.table.length === 0 || b.table.length === 0) |
| { |
| return [a, b]; |
| } |
| |
| var toRemove = calcToRemove(a, b); |
| if (toRemove <= E) |
| { |
| return [a, b]; |
| } |
| return shuffle(a, b, toRemove); |
| } |
| |
| // Helperfunctions for append_. Replaces a child node at the side of the parent. |
| function insertRight(parent, node) |
| { |
| var index = parent.table.length - 1; |
| parent.table[index] = node; |
| parent.lengths[index] = length(node); |
| parent.lengths[index] += index > 0 ? parent.lengths[index - 1] : 0; |
| } |
| |
| function insertLeft(parent, node) |
| { |
| if (node.table.length > 0) |
| { |
| parent.table[0] = node; |
| parent.lengths[0] = length(node); |
| |
| var len = length(parent.table[0]); |
| for (var i = 1; i < parent.lengths.length; i++) |
| { |
| len += length(parent.table[i]); |
| parent.lengths[i] = len; |
| } |
| } |
| else |
| { |
| parent.table.shift(); |
| for (var i = 1; i < parent.lengths.length; i++) |
| { |
| parent.lengths[i] = parent.lengths[i] - parent.lengths[0]; |
| } |
| parent.lengths.shift(); |
| } |
| } |
| |
| // Returns the extra search steps for E. Refer to the paper. |
| function calcToRemove(a, b) |
| { |
| var subLengths = 0; |
| for (var i = 0; i < a.table.length; i++) |
| { |
| subLengths += a.table[i].table.length; |
| } |
| for (var i = 0; i < b.table.length; i++) |
| { |
| subLengths += b.table[i].table.length; |
| } |
| |
| var toRemove = a.table.length + b.table.length; |
| return toRemove - (Math.floor((subLengths - 1) / M) + 1); |
| } |
| |
| // get2, set2 and saveSlot are helpers for accessing elements over two arrays. |
| function get2(a, b, index) |
| { |
| return index < a.length |
| ? a[index] |
| : b[index - a.length]; |
| } |
| |
| function set2(a, b, index, value) |
| { |
| if (index < a.length) |
| { |
| a[index] = value; |
| } |
| else |
| { |
| b[index - a.length] = value; |
| } |
| } |
| |
| function saveSlot(a, b, index, slot) |
| { |
| set2(a.table, b.table, index, slot); |
| |
| var l = (index === 0 || index === a.lengths.length) |
| ? 0 |
| : get2(a.lengths, a.lengths, index - 1); |
| |
| set2(a.lengths, b.lengths, index, l + length(slot)); |
| } |
| |
| // Creates a node or leaf with a given length at their arrays for perfomance. |
| // Is only used by shuffle. |
| function createNode(h, length) |
| { |
| if (length < 0) |
| { |
| length = 0; |
| } |
| var a = { |
| ctor: '_Array', |
| height: h, |
| table: new Array(length) |
| }; |
| if (h > 0) |
| { |
| a.lengths = new Array(length); |
| } |
| return a; |
| } |
| |
| // Returns an array of two balanced nodes. |
| function shuffle(a, b, toRemove) |
| { |
| var newA = createNode(a.height, Math.min(M, a.table.length + b.table.length - toRemove)); |
| var newB = createNode(a.height, newA.table.length - (a.table.length + b.table.length - toRemove)); |
| |
| // Skip the slots with size M. More precise: copy the slot references |
| // to the new node |
| var read = 0; |
| while (get2(a.table, b.table, read).table.length % M === 0) |
| { |
| set2(newA.table, newB.table, read, get2(a.table, b.table, read)); |
| set2(newA.lengths, newB.lengths, read, get2(a.lengths, b.lengths, read)); |
| read++; |
| } |
| |
| // Pulling items from left to right, caching in a slot before writing |
| // it into the new nodes. |
| var write = read; |
| var slot = new createNode(a.height - 1, 0); |
| var from = 0; |
| |
| // If the current slot is still containing data, then there will be at |
| // least one more write, so we do not break this loop yet. |
| while (read - write - (slot.table.length > 0 ? 1 : 0) < toRemove) |
| { |
| // Find out the max possible items for copying. |
| var source = get2(a.table, b.table, read); |
| var to = Math.min(M - slot.table.length, source.table.length); |
| |
| // Copy and adjust size table. |
| slot.table = slot.table.concat(source.table.slice(from, to)); |
| if (slot.height > 0) |
| { |
| var len = slot.lengths.length; |
| for (var i = len; i < len + to - from; i++) |
| { |
| slot.lengths[i] = length(slot.table[i]); |
| slot.lengths[i] += (i > 0 ? slot.lengths[i - 1] : 0); |
| } |
| } |
| |
| from += to; |
| |
| // Only proceed to next slots[i] if the current one was |
| // fully copied. |
| if (source.table.length <= to) |
| { |
| read++; from = 0; |
| } |
| |
| // Only create a new slot if the current one is filled up. |
| if (slot.table.length === M) |
| { |
| saveSlot(newA, newB, write, slot); |
| slot = createNode(a.height - 1, 0); |
| write++; |
| } |
| } |
| |
| // Cleanup after the loop. Copy the last slot into the new nodes. |
| if (slot.table.length > 0) |
| { |
| saveSlot(newA, newB, write, slot); |
| write++; |
| } |
| |
| // Shift the untouched slots to the left |
| while (read < a.table.length + b.table.length ) |
| { |
| saveSlot(newA, newB, write, get2(a.table, b.table, read)); |
| read++; |
| write++; |
| } |
| |
| return [newA, newB]; |
| } |
| |
| // Navigation functions |
| function botRight(a) |
| { |
| return a.table[a.table.length - 1]; |
| } |
| function botLeft(a) |
| { |
| return a.table[0]; |
| } |
| |
| // Copies a node for updating. Note that you should not use this if |
| // only updating only one of "table" or "lengths" for performance reasons. |
| function nodeCopy(a) |
| { |
| var newA = { |
| ctor: '_Array', |
| height: a.height, |
| table: a.table.slice() |
| }; |
| if (a.height > 0) |
| { |
| newA.lengths = a.lengths.slice(); |
| } |
| return newA; |
| } |
| |
| // Returns how many items are in the tree. |
| function length(array) |
| { |
| if (array.height === 0) |
| { |
| return array.table.length; |
| } |
| else |
| { |
| return array.lengths[array.lengths.length - 1]; |
| } |
| } |
| |
| // Calculates in which slot of "table" the item probably is, then |
| // find the exact slot via forward searching in "lengths". Returns the index. |
| function getSlot(i, a) |
| { |
| var slot = i >> (5 * a.height); |
| while (a.lengths[slot] <= i) |
| { |
| slot++; |
| } |
| return slot; |
| } |
| |
| // Recursively creates a tree with a given height containing |
| // only the given item. |
| function create(item, h) |
| { |
| if (h === 0) |
| { |
| return { |
| ctor: '_Array', |
| height: 0, |
| table: [item] |
| }; |
| } |
| return { |
| ctor: '_Array', |
| height: h, |
| table: [create(item, h - 1)], |
| lengths: [1] |
| }; |
| } |
| |
| // Recursively creates a tree that contains the given tree. |
| function parentise(tree, h) |
| { |
| if (h === tree.height) |
| { |
| return tree; |
| } |
| |
| return { |
| ctor: '_Array', |
| height: h, |
| table: [parentise(tree, h - 1)], |
| lengths: [length(tree)] |
| }; |
| } |
| |
| // Emphasizes blood brotherhood beneath two trees. |
| function siblise(a, b) |
| { |
| return { |
| ctor: '_Array', |
| height: a.height + 1, |
| table: [a, b], |
| lengths: [length(a), length(a) + length(b)] |
| }; |
| } |
| |
| function toJSArray(a) |
| { |
| var jsArray = new Array(length(a)); |
| toJSArray_(jsArray, 0, a); |
| return jsArray; |
| } |
| |
| function toJSArray_(jsArray, i, a) |
| { |
| for (var t = 0; t < a.table.length; t++) |
| { |
| if (a.height === 0) |
| { |
| jsArray[i + t] = a.table[t]; |
| } |
| else |
| { |
| var inc = t === 0 ? 0 : a.lengths[t - 1]; |
| toJSArray_(jsArray, i + inc, a.table[t]); |
| } |
| } |
| } |
| |
| function fromJSArray(jsArray) |
| { |
| if (jsArray.length === 0) |
| { |
| return empty; |
| } |
| var h = Math.floor(Math.log(jsArray.length) / Math.log(M)); |
| return fromJSArray_(jsArray, h, 0, jsArray.length); |
| } |
| |
| function fromJSArray_(jsArray, h, from, to) |
| { |
| if (h === 0) |
| { |
| return { |
| ctor: '_Array', |
| height: 0, |
| table: jsArray.slice(from, to) |
| }; |
| } |
| |
| var step = Math.pow(M, h); |
| var table = new Array(Math.ceil((to - from) / step)); |
| var lengths = new Array(table.length); |
| for (var i = 0; i < table.length; i++) |
| { |
| table[i] = fromJSArray_(jsArray, h - 1, from + (i * step), Math.min(from + ((i + 1) * step), to)); |
| lengths[i] = length(table[i]) + (i > 0 ? lengths[i - 1] : 0); |
| } |
| return { |
| ctor: '_Array', |
| height: h, |
| table: table, |
| lengths: lengths |
| }; |
| } |
| |
| return { |
| empty: empty, |
| fromList: fromList, |
| toList: toList, |
| initialize: F2(initialize), |
| append: F2(append), |
| push: F2(push), |
| slice: F3(slice), |
| get: F2(get), |
| set: F3(set), |
| map: F2(map), |
| indexedMap: F2(indexedMap), |
| foldl: F3(foldl), |
| foldr: F3(foldr), |
| length: length, |
| |
| toJSArray: toJSArray, |
| fromJSArray: fromJSArray |
| }; |
| |
| }(); |
| var _elm_lang$core$Array$append = _elm_lang$core$Native_Array.append; |
| var _elm_lang$core$Array$length = _elm_lang$core$Native_Array.length; |
| var _elm_lang$core$Array$isEmpty = function (array) { |
| return _elm_lang$core$Native_Utils.eq( |
| _elm_lang$core$Array$length(array), |
| 0); |
| }; |
| var _elm_lang$core$Array$slice = _elm_lang$core$Native_Array.slice; |
| var _elm_lang$core$Array$set = _elm_lang$core$Native_Array.set; |
| var _elm_lang$core$Array$get = F2( |
| function (i, array) { |
| return ((_elm_lang$core$Native_Utils.cmp(0, i) < 1) && (_elm_lang$core$Native_Utils.cmp( |
| i, |
| _elm_lang$core$Native_Array.length(array)) < 0)) ? _elm_lang$core$Maybe$Just( |
| A2(_elm_lang$core$Native_Array.get, i, array)) : _elm_lang$core$Maybe$Nothing; |
| }); |
| var _elm_lang$core$Array$push = _elm_lang$core$Native_Array.push; |
| var _elm_lang$core$Array$empty = _elm_lang$core$Native_Array.empty; |
| var _elm_lang$core$Array$filter = F2( |
| function (isOkay, arr) { |
| var update = F2( |
| function (x, xs) { |
| return isOkay(x) ? A2(_elm_lang$core$Native_Array.push, x, xs) : xs; |
| }); |
| return A3(_elm_lang$core$Native_Array.foldl, update, _elm_lang$core$Native_Array.empty, arr); |
| }); |
| var _elm_lang$core$Array$foldr = _elm_lang$core$Native_Array.foldr; |
| var _elm_lang$core$Array$foldl = _elm_lang$core$Native_Array.foldl; |
| var _elm_lang$core$Array$indexedMap = _elm_lang$core$Native_Array.indexedMap; |
| var _elm_lang$core$Array$map = _elm_lang$core$Native_Array.map; |
| var _elm_lang$core$Array$toIndexedList = function (array) { |
| return A3( |
| _elm_lang$core$List$map2, |
| F2( |
| function (v0, v1) { |
| return {ctor: '_Tuple2', _0: v0, _1: v1}; |
| }), |
| _elm_lang$core$Native_List.range( |
| 0, |
| _elm_lang$core$Native_Array.length(array) - 1), |
| _elm_lang$core$Native_Array.toList(array)); |
| }; |
| var _elm_lang$core$Array$toList = _elm_lang$core$Native_Array.toList; |
| var _elm_lang$core$Array$fromList = _elm_lang$core$Native_Array.fromList; |
| var _elm_lang$core$Array$initialize = _elm_lang$core$Native_Array.initialize; |
| var _elm_lang$core$Array$repeat = F2( |
| function (n, e) { |
| return A2( |
| _elm_lang$core$Array$initialize, |
| n, |
| _elm_lang$core$Basics$always(e)); |
| }); |
| var _elm_lang$core$Array$Array = {ctor: 'Array'}; |
| |
| var _elm_lang$core$Task$onError = _elm_lang$core$Native_Scheduler.onError; |
| var _elm_lang$core$Task$andThen = _elm_lang$core$Native_Scheduler.andThen; |
| var _elm_lang$core$Task$spawnCmd = F2( |
| function (router, _p0) { |
| var _p1 = _p0; |
| return _elm_lang$core$Native_Scheduler.spawn( |
| A2( |
| _elm_lang$core$Task$andThen, |
| _p1._0, |
| _elm_lang$core$Platform$sendToApp(router))); |
| }); |
| var _elm_lang$core$Task$fail = _elm_lang$core$Native_Scheduler.fail; |
| var _elm_lang$core$Task$mapError = F2( |
| function (f, task) { |
| return A2( |
| _elm_lang$core$Task$onError, |
| task, |
| function (err) { |
| return _elm_lang$core$Task$fail( |
| f(err)); |
| }); |
| }); |
| var _elm_lang$core$Task$succeed = _elm_lang$core$Native_Scheduler.succeed; |
| var _elm_lang$core$Task$map = F2( |
| function (func, taskA) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskA, |
| function (a) { |
| return _elm_lang$core$Task$succeed( |
| func(a)); |
| }); |
| }); |
| var _elm_lang$core$Task$map2 = F3( |
| function (func, taskA, taskB) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskA, |
| function (a) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskB, |
| function (b) { |
| return _elm_lang$core$Task$succeed( |
| A2(func, a, b)); |
| }); |
| }); |
| }); |
| var _elm_lang$core$Task$map3 = F4( |
| function (func, taskA, taskB, taskC) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskA, |
| function (a) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskB, |
| function (b) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskC, |
| function (c) { |
| return _elm_lang$core$Task$succeed( |
| A3(func, a, b, c)); |
| }); |
| }); |
| }); |
| }); |
| var _elm_lang$core$Task$map4 = F5( |
| function (func, taskA, taskB, taskC, taskD) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskA, |
| function (a) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskB, |
| function (b) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskC, |
| function (c) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskD, |
| function (d) { |
| return _elm_lang$core$Task$succeed( |
| A4(func, a, b, c, d)); |
| }); |
| }); |
| }); |
| }); |
| }); |
| var _elm_lang$core$Task$map5 = F6( |
| function (func, taskA, taskB, taskC, taskD, taskE) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskA, |
| function (a) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskB, |
| function (b) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskC, |
| function (c) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskD, |
| function (d) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskE, |
| function (e) { |
| return _elm_lang$core$Task$succeed( |
| A5(func, a, b, c, d, e)); |
| }); |
| }); |
| }); |
| }); |
| }); |
| }); |
| var _elm_lang$core$Task$andMap = F2( |
| function (taskFunc, taskValue) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskFunc, |
| function (func) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| taskValue, |
| function (value) { |
| return _elm_lang$core$Task$succeed( |
| func(value)); |
| }); |
| }); |
| }); |
| var _elm_lang$core$Task$sequence = function (tasks) { |
| var _p2 = tasks; |
| if (_p2.ctor === '[]') { |
| return _elm_lang$core$Task$succeed( |
| _elm_lang$core$Native_List.fromArray( |
| [])); |
| } else { |
| return A3( |
| _elm_lang$core$Task$map2, |
| F2( |
| function (x, y) { |
| return A2(_elm_lang$core$List_ops['::'], x, y); |
| }), |
| _p2._0, |
| _elm_lang$core$Task$sequence(_p2._1)); |
| } |
| }; |
| var _elm_lang$core$Task$onEffects = F3( |
| function (router, commands, state) { |
| return A2( |
| _elm_lang$core$Task$map, |
| function (_p3) { |
| return {ctor: '_Tuple0'}; |
| }, |
| _elm_lang$core$Task$sequence( |
| A2( |
| _elm_lang$core$List$map, |
| _elm_lang$core$Task$spawnCmd(router), |
| commands))); |
| }); |
| var _elm_lang$core$Task$toMaybe = function (task) { |
| return A2( |
| _elm_lang$core$Task$onError, |
| A2(_elm_lang$core$Task$map, _elm_lang$core$Maybe$Just, task), |
| function (_p4) { |
| return _elm_lang$core$Task$succeed(_elm_lang$core$Maybe$Nothing); |
| }); |
| }; |
| var _elm_lang$core$Task$fromMaybe = F2( |
| function ($default, maybe) { |
| var _p5 = maybe; |
| if (_p5.ctor === 'Just') { |
| return _elm_lang$core$Task$succeed(_p5._0); |
| } else { |
| return _elm_lang$core$Task$fail($default); |
| } |
| }); |
| var _elm_lang$core$Task$toResult = function (task) { |
| return A2( |
| _elm_lang$core$Task$onError, |
| A2(_elm_lang$core$Task$map, _elm_lang$core$Result$Ok, task), |
| function (msg) { |
| return _elm_lang$core$Task$succeed( |
| _elm_lang$core$Result$Err(msg)); |
| }); |
| }; |
| var _elm_lang$core$Task$fromResult = function (result) { |
| var _p6 = result; |
| if (_p6.ctor === 'Ok') { |
| return _elm_lang$core$Task$succeed(_p6._0); |
| } else { |
| return _elm_lang$core$Task$fail(_p6._0); |
| } |
| }; |
| var _elm_lang$core$Task$init = _elm_lang$core$Task$succeed( |
| {ctor: '_Tuple0'}); |
| var _elm_lang$core$Task$onSelfMsg = F3( |
| function (_p9, _p8, _p7) { |
| return _elm_lang$core$Task$succeed( |
| {ctor: '_Tuple0'}); |
| }); |
| var _elm_lang$core$Task$command = _elm_lang$core$Native_Platform.leaf('Task'); |
| var _elm_lang$core$Task$T = function (a) { |
| return {ctor: 'T', _0: a}; |
| }; |
| var _elm_lang$core$Task$perform = F3( |
| function (onFail, onSuccess, task) { |
| return _elm_lang$core$Task$command( |
| _elm_lang$core$Task$T( |
| A2( |
| _elm_lang$core$Task$onError, |
| A2(_elm_lang$core$Task$map, onSuccess, task), |
| function (x) { |
| return _elm_lang$core$Task$succeed( |
| onFail(x)); |
| }))); |
| }); |
| var _elm_lang$core$Task$cmdMap = F2( |
| function (tagger, _p10) { |
| var _p11 = _p10; |
| return _elm_lang$core$Task$T( |
| A2(_elm_lang$core$Task$map, tagger, _p11._0)); |
| }); |
| _elm_lang$core$Native_Platform.effectManagers['Task'] = {pkg: 'elm-lang/core', init: _elm_lang$core$Task$init, onEffects: _elm_lang$core$Task$onEffects, onSelfMsg: _elm_lang$core$Task$onSelfMsg, tag: 'cmd', cmdMap: _elm_lang$core$Task$cmdMap}; |
| |
| var _elm_lang$core$Dict$foldr = F3( |
| function (f, acc, t) { |
| foldr: |
| while (true) { |
| var _p0 = t; |
| if (_p0.ctor === 'RBEmpty_elm_builtin') { |
| return acc; |
| } else { |
| var _v1 = f, |
| _v2 = A3( |
| f, |
| _p0._1, |
| _p0._2, |
| A3(_elm_lang$core$Dict$foldr, f, acc, _p0._4)), |
| _v3 = _p0._3; |
| f = _v1; |
| acc = _v2; |
| t = _v3; |
| continue foldr; |
| } |
| } |
| }); |
| var _elm_lang$core$Dict$keys = function (dict) { |
| return A3( |
| _elm_lang$core$Dict$foldr, |
| F3( |
| function (key, value, keyList) { |
| return A2(_elm_lang$core$List_ops['::'], key, keyList); |
| }), |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| dict); |
| }; |
| var _elm_lang$core$Dict$values = function (dict) { |
| return A3( |
| _elm_lang$core$Dict$foldr, |
| F3( |
| function (key, value, valueList) { |
| return A2(_elm_lang$core$List_ops['::'], value, valueList); |
| }), |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| dict); |
| }; |
| var _elm_lang$core$Dict$toList = function (dict) { |
| return A3( |
| _elm_lang$core$Dict$foldr, |
| F3( |
| function (key, value, list) { |
| return A2( |
| _elm_lang$core$List_ops['::'], |
| {ctor: '_Tuple2', _0: key, _1: value}, |
| list); |
| }), |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| dict); |
| }; |
| var _elm_lang$core$Dict$foldl = F3( |
| function (f, acc, dict) { |
| foldl: |
| while (true) { |
| var _p1 = dict; |
| if (_p1.ctor === 'RBEmpty_elm_builtin') { |
| return acc; |
| } else { |
| var _v5 = f, |
| _v6 = A3( |
| f, |
| _p1._1, |
| _p1._2, |
| A3(_elm_lang$core$Dict$foldl, f, acc, _p1._3)), |
| _v7 = _p1._4; |
| f = _v5; |
| acc = _v6; |
| dict = _v7; |
| continue foldl; |
| } |
| } |
| }); |
| var _elm_lang$core$Dict$merge = F6( |
| function (leftStep, bothStep, rightStep, leftDict, rightDict, initialResult) { |
| var stepState = F3( |
| function (rKey, rValue, _p2) { |
| stepState: |
| while (true) { |
| var _p3 = _p2; |
| var _p9 = _p3._1; |
| var _p8 = _p3._0; |
| var _p4 = _p8; |
| if (_p4.ctor === '[]') { |
| return { |
| ctor: '_Tuple2', |
| _0: _p8, |
| _1: A3(rightStep, rKey, rValue, _p9) |
| }; |
| } else { |
| var _p7 = _p4._1; |
| var _p6 = _p4._0._1; |
| var _p5 = _p4._0._0; |
| if (_elm_lang$core$Native_Utils.cmp(_p5, rKey) < 0) { |
| var _v10 = rKey, |
| _v11 = rValue, |
| _v12 = { |
| ctor: '_Tuple2', |
| _0: _p7, |
| _1: A3(leftStep, _p5, _p6, _p9) |
| }; |
| rKey = _v10; |
| rValue = _v11; |
| _p2 = _v12; |
| continue stepState; |
| } else { |
| if (_elm_lang$core$Native_Utils.cmp(_p5, rKey) > 0) { |
| return { |
| ctor: '_Tuple2', |
| _0: _p8, |
| _1: A3(rightStep, rKey, rValue, _p9) |
| }; |
| } else { |
| return { |
| ctor: '_Tuple2', |
| _0: _p7, |
| _1: A4(bothStep, _p5, _p6, rValue, _p9) |
| }; |
| } |
| } |
| } |
| } |
| }); |
| var _p10 = A3( |
| _elm_lang$core$Dict$foldl, |
| stepState, |
| { |
| ctor: '_Tuple2', |
| _0: _elm_lang$core$Dict$toList(leftDict), |
| _1: initialResult |
| }, |
| rightDict); |
| var leftovers = _p10._0; |
| var intermediateResult = _p10._1; |
| return A3( |
| _elm_lang$core$List$foldl, |
| F2( |
| function (_p11, result) { |
| var _p12 = _p11; |
| return A3(leftStep, _p12._0, _p12._1, result); |
| }), |
| intermediateResult, |
| leftovers); |
| }); |
| var _elm_lang$core$Dict$reportRemBug = F4( |
| function (msg, c, lgot, rgot) { |
| return _elm_lang$core$Native_Debug.crash( |
| _elm_lang$core$String$concat( |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| 'Internal red-black tree invariant violated, expected ', |
| msg, |
| ' and got ', |
| _elm_lang$core$Basics$toString(c), |
| '/', |
| lgot, |
| '/', |
| rgot, |
| '\nPlease report this bug to <https://github.com/elm-lang/core/issues>' |
| ]))); |
| }); |
| var _elm_lang$core$Dict$isBBlack = function (dict) { |
| var _p13 = dict; |
| _v14_2: |
| do { |
| if (_p13.ctor === 'RBNode_elm_builtin') { |
| if (_p13._0.ctor === 'BBlack') { |
| return true; |
| } else { |
| break _v14_2; |
| } |
| } else { |
| if (_p13._0.ctor === 'LBBlack') { |
| return true; |
| } else { |
| break _v14_2; |
| } |
| } |
| } while(false); |
| return false; |
| }; |
| var _elm_lang$core$Dict$sizeHelp = F2( |
| function (n, dict) { |
| sizeHelp: |
| while (true) { |
| var _p14 = dict; |
| if (_p14.ctor === 'RBEmpty_elm_builtin') { |
| return n; |
| } else { |
| var _v16 = A2(_elm_lang$core$Dict$sizeHelp, n + 1, _p14._4), |
| _v17 = _p14._3; |
| n = _v16; |
| dict = _v17; |
| continue sizeHelp; |
| } |
| } |
| }); |
| var _elm_lang$core$Dict$size = function (dict) { |
| return A2(_elm_lang$core$Dict$sizeHelp, 0, dict); |
| }; |
| var _elm_lang$core$Dict$get = F2( |
| function (targetKey, dict) { |
| get: |
| while (true) { |
| var _p15 = dict; |
| if (_p15.ctor === 'RBEmpty_elm_builtin') { |
| return _elm_lang$core$Maybe$Nothing; |
| } else { |
| var _p16 = A2(_elm_lang$core$Basics$compare, targetKey, _p15._1); |
| switch (_p16.ctor) { |
| case 'LT': |
| var _v20 = targetKey, |
| _v21 = _p15._3; |
| targetKey = _v20; |
| dict = _v21; |
| continue get; |
| case 'EQ': |
| return _elm_lang$core$Maybe$Just(_p15._2); |
| default: |
| var _v22 = targetKey, |
| _v23 = _p15._4; |
| targetKey = _v22; |
| dict = _v23; |
| continue get; |
| } |
| } |
| } |
| }); |
| var _elm_lang$core$Dict$member = F2( |
| function (key, dict) { |
| var _p17 = A2(_elm_lang$core$Dict$get, key, dict); |
| if (_p17.ctor === 'Just') { |
| return true; |
| } else { |
| return false; |
| } |
| }); |
| var _elm_lang$core$Dict$maxWithDefault = F3( |
| function (k, v, r) { |
| maxWithDefault: |
| while (true) { |
| var _p18 = r; |
| if (_p18.ctor === 'RBEmpty_elm_builtin') { |
| return {ctor: '_Tuple2', _0: k, _1: v}; |
| } else { |
| var _v26 = _p18._1, |
| _v27 = _p18._2, |
| _v28 = _p18._4; |
| k = _v26; |
| v = _v27; |
| r = _v28; |
| continue maxWithDefault; |
| } |
| } |
| }); |
| var _elm_lang$core$Dict$NBlack = {ctor: 'NBlack'}; |
| var _elm_lang$core$Dict$BBlack = {ctor: 'BBlack'}; |
| var _elm_lang$core$Dict$Black = {ctor: 'Black'}; |
| var _elm_lang$core$Dict$blackish = function (t) { |
| var _p19 = t; |
| if (_p19.ctor === 'RBNode_elm_builtin') { |
| var _p20 = _p19._0; |
| return _elm_lang$core$Native_Utils.eq(_p20, _elm_lang$core$Dict$Black) || _elm_lang$core$Native_Utils.eq(_p20, _elm_lang$core$Dict$BBlack); |
| } else { |
| return true; |
| } |
| }; |
| var _elm_lang$core$Dict$Red = {ctor: 'Red'}; |
| var _elm_lang$core$Dict$moreBlack = function (color) { |
| var _p21 = color; |
| switch (_p21.ctor) { |
| case 'Black': |
| return _elm_lang$core$Dict$BBlack; |
| case 'Red': |
| return _elm_lang$core$Dict$Black; |
| case 'NBlack': |
| return _elm_lang$core$Dict$Red; |
| default: |
| return _elm_lang$core$Native_Debug.crash('Can\'t make a double black node more black!'); |
| } |
| }; |
| var _elm_lang$core$Dict$lessBlack = function (color) { |
| var _p22 = color; |
| switch (_p22.ctor) { |
| case 'BBlack': |
| return _elm_lang$core$Dict$Black; |
| case 'Black': |
| return _elm_lang$core$Dict$Red; |
| case 'Red': |
| return _elm_lang$core$Dict$NBlack; |
| default: |
| return _elm_lang$core$Native_Debug.crash('Can\'t make a negative black node less black!'); |
| } |
| }; |
| var _elm_lang$core$Dict$LBBlack = {ctor: 'LBBlack'}; |
| var _elm_lang$core$Dict$LBlack = {ctor: 'LBlack'}; |
| var _elm_lang$core$Dict$RBEmpty_elm_builtin = function (a) { |
| return {ctor: 'RBEmpty_elm_builtin', _0: a}; |
| }; |
| var _elm_lang$core$Dict$empty = _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); |
| var _elm_lang$core$Dict$isEmpty = function (dict) { |
| return _elm_lang$core$Native_Utils.eq(dict, _elm_lang$core$Dict$empty); |
| }; |
| var _elm_lang$core$Dict$RBNode_elm_builtin = F5( |
| function (a, b, c, d, e) { |
| return {ctor: 'RBNode_elm_builtin', _0: a, _1: b, _2: c, _3: d, _4: e}; |
| }); |
| var _elm_lang$core$Dict$ensureBlackRoot = function (dict) { |
| var _p23 = dict; |
| if ((_p23.ctor === 'RBNode_elm_builtin') && (_p23._0.ctor === 'Red')) { |
| return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p23._1, _p23._2, _p23._3, _p23._4); |
| } else { |
| return dict; |
| } |
| }; |
| var _elm_lang$core$Dict$lessBlackTree = function (dict) { |
| var _p24 = dict; |
| if (_p24.ctor === 'RBNode_elm_builtin') { |
| return A5( |
| _elm_lang$core$Dict$RBNode_elm_builtin, |
| _elm_lang$core$Dict$lessBlack(_p24._0), |
| _p24._1, |
| _p24._2, |
| _p24._3, |
| _p24._4); |
| } else { |
| return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); |
| } |
| }; |
| var _elm_lang$core$Dict$balancedTree = function (col) { |
| return function (xk) { |
| return function (xv) { |
| return function (yk) { |
| return function (yv) { |
| return function (zk) { |
| return function (zv) { |
| return function (a) { |
| return function (b) { |
| return function (c) { |
| return function (d) { |
| return A5( |
| _elm_lang$core$Dict$RBNode_elm_builtin, |
| _elm_lang$core$Dict$lessBlack(col), |
| yk, |
| yv, |
| A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, xk, xv, a, b), |
| A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, zk, zv, c, d)); |
| }; |
| }; |
| }; |
| }; |
| }; |
| }; |
| }; |
| }; |
| }; |
| }; |
| }; |
| var _elm_lang$core$Dict$blacken = function (t) { |
| var _p25 = t; |
| if (_p25.ctor === 'RBEmpty_elm_builtin') { |
| return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); |
| } else { |
| return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p25._1, _p25._2, _p25._3, _p25._4); |
| } |
| }; |
| var _elm_lang$core$Dict$redden = function (t) { |
| var _p26 = t; |
| if (_p26.ctor === 'RBEmpty_elm_builtin') { |
| return _elm_lang$core$Native_Debug.crash('can\'t make a Leaf red'); |
| } else { |
| return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Red, _p26._1, _p26._2, _p26._3, _p26._4); |
| } |
| }; |
| var _elm_lang$core$Dict$balanceHelp = function (tree) { |
| var _p27 = tree; |
| _v36_6: |
| do { |
| _v36_5: |
| do { |
| _v36_4: |
| do { |
| _v36_3: |
| do { |
| _v36_2: |
| do { |
| _v36_1: |
| do { |
| _v36_0: |
| do { |
| if (_p27.ctor === 'RBNode_elm_builtin') { |
| if (_p27._3.ctor === 'RBNode_elm_builtin') { |
| if (_p27._4.ctor === 'RBNode_elm_builtin') { |
| switch (_p27._3._0.ctor) { |
| case 'Red': |
| switch (_p27._4._0.ctor) { |
| case 'Red': |
| if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { |
| break _v36_0; |
| } else { |
| if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { |
| break _v36_1; |
| } else { |
| if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { |
| break _v36_2; |
| } else { |
| if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { |
| break _v36_3; |
| } else { |
| break _v36_6; |
| } |
| } |
| } |
| } |
| case 'NBlack': |
| if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { |
| break _v36_0; |
| } else { |
| if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { |
| break _v36_1; |
| } else { |
| if (((((_p27._0.ctor === 'BBlack') && (_p27._4._3.ctor === 'RBNode_elm_builtin')) && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { |
| break _v36_4; |
| } else { |
| break _v36_6; |
| } |
| } |
| } |
| default: |
| if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { |
| break _v36_0; |
| } else { |
| if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { |
| break _v36_1; |
| } else { |
| break _v36_6; |
| } |
| } |
| } |
| case 'NBlack': |
| switch (_p27._4._0.ctor) { |
| case 'Red': |
| if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { |
| break _v36_2; |
| } else { |
| if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { |
| break _v36_3; |
| } else { |
| if (((((_p27._0.ctor === 'BBlack') && (_p27._3._3.ctor === 'RBNode_elm_builtin')) && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { |
| break _v36_5; |
| } else { |
| break _v36_6; |
| } |
| } |
| } |
| case 'NBlack': |
| if (_p27._0.ctor === 'BBlack') { |
| if ((((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { |
| break _v36_4; |
| } else { |
| if ((((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { |
| break _v36_5; |
| } else { |
| break _v36_6; |
| } |
| } |
| } else { |
| break _v36_6; |
| } |
| default: |
| if (((((_p27._0.ctor === 'BBlack') && (_p27._3._3.ctor === 'RBNode_elm_builtin')) && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { |
| break _v36_5; |
| } else { |
| break _v36_6; |
| } |
| } |
| default: |
| switch (_p27._4._0.ctor) { |
| case 'Red': |
| if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { |
| break _v36_2; |
| } else { |
| if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { |
| break _v36_3; |
| } else { |
| break _v36_6; |
| } |
| } |
| case 'NBlack': |
| if (((((_p27._0.ctor === 'BBlack') && (_p27._4._3.ctor === 'RBNode_elm_builtin')) && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { |
| break _v36_4; |
| } else { |
| break _v36_6; |
| } |
| default: |
| break _v36_6; |
| } |
| } |
| } else { |
| switch (_p27._3._0.ctor) { |
| case 'Red': |
| if ((_p27._3._3.ctor === 'RBNode_elm_builtin') && (_p27._3._3._0.ctor === 'Red')) { |
| break _v36_0; |
| } else { |
| if ((_p27._3._4.ctor === 'RBNode_elm_builtin') && (_p27._3._4._0.ctor === 'Red')) { |
| break _v36_1; |
| } else { |
| break _v36_6; |
| } |
| } |
| case 'NBlack': |
| if (((((_p27._0.ctor === 'BBlack') && (_p27._3._3.ctor === 'RBNode_elm_builtin')) && (_p27._3._3._0.ctor === 'Black')) && (_p27._3._4.ctor === 'RBNode_elm_builtin')) && (_p27._3._4._0.ctor === 'Black')) { |
| break _v36_5; |
| } else { |
| break _v36_6; |
| } |
| default: |
| break _v36_6; |
| } |
| } |
| } else { |
| if (_p27._4.ctor === 'RBNode_elm_builtin') { |
| switch (_p27._4._0.ctor) { |
| case 'Red': |
| if ((_p27._4._3.ctor === 'RBNode_elm_builtin') && (_p27._4._3._0.ctor === 'Red')) { |
| break _v36_2; |
| } else { |
| if ((_p27._4._4.ctor === 'RBNode_elm_builtin') && (_p27._4._4._0.ctor === 'Red')) { |
| break _v36_3; |
| } else { |
| break _v36_6; |
| } |
| } |
| case 'NBlack': |
| if (((((_p27._0.ctor === 'BBlack') && (_p27._4._3.ctor === 'RBNode_elm_builtin')) && (_p27._4._3._0.ctor === 'Black')) && (_p27._4._4.ctor === 'RBNode_elm_builtin')) && (_p27._4._4._0.ctor === 'Black')) { |
| break _v36_4; |
| } else { |
| break _v36_6; |
| } |
| default: |
| break _v36_6; |
| } |
| } else { |
| break _v36_6; |
| } |
| } |
| } else { |
| break _v36_6; |
| } |
| } while(false); |
| return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._3._3._1)(_p27._3._3._2)(_p27._3._1)(_p27._3._2)(_p27._1)(_p27._2)(_p27._3._3._3)(_p27._3._3._4)(_p27._3._4)(_p27._4); |
| } while(false); |
| return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._3._1)(_p27._3._2)(_p27._3._4._1)(_p27._3._4._2)(_p27._1)(_p27._2)(_p27._3._3)(_p27._3._4._3)(_p27._3._4._4)(_p27._4); |
| } while(false); |
| return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._1)(_p27._2)(_p27._4._3._1)(_p27._4._3._2)(_p27._4._1)(_p27._4._2)(_p27._3)(_p27._4._3._3)(_p27._4._3._4)(_p27._4._4); |
| } while(false); |
| return _elm_lang$core$Dict$balancedTree(_p27._0)(_p27._1)(_p27._2)(_p27._4._1)(_p27._4._2)(_p27._4._4._1)(_p27._4._4._2)(_p27._3)(_p27._4._3)(_p27._4._4._3)(_p27._4._4._4); |
| } while(false); |
| return A5( |
| _elm_lang$core$Dict$RBNode_elm_builtin, |
| _elm_lang$core$Dict$Black, |
| _p27._4._3._1, |
| _p27._4._3._2, |
| A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p27._1, _p27._2, _p27._3, _p27._4._3._3), |
| A5( |
| _elm_lang$core$Dict$balance, |
| _elm_lang$core$Dict$Black, |
| _p27._4._1, |
| _p27._4._2, |
| _p27._4._3._4, |
| _elm_lang$core$Dict$redden(_p27._4._4))); |
| } while(false); |
| return A5( |
| _elm_lang$core$Dict$RBNode_elm_builtin, |
| _elm_lang$core$Dict$Black, |
| _p27._3._4._1, |
| _p27._3._4._2, |
| A5( |
| _elm_lang$core$Dict$balance, |
| _elm_lang$core$Dict$Black, |
| _p27._3._1, |
| _p27._3._2, |
| _elm_lang$core$Dict$redden(_p27._3._3), |
| _p27._3._4._3), |
| A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p27._1, _p27._2, _p27._3._4._4, _p27._4)); |
| } while(false); |
| return tree; |
| }; |
| var _elm_lang$core$Dict$balance = F5( |
| function (c, k, v, l, r) { |
| var tree = A5(_elm_lang$core$Dict$RBNode_elm_builtin, c, k, v, l, r); |
| return _elm_lang$core$Dict$blackish(tree) ? _elm_lang$core$Dict$balanceHelp(tree) : tree; |
| }); |
| var _elm_lang$core$Dict$bubble = F5( |
| function (c, k, v, l, r) { |
| return (_elm_lang$core$Dict$isBBlack(l) || _elm_lang$core$Dict$isBBlack(r)) ? A5( |
| _elm_lang$core$Dict$balance, |
| _elm_lang$core$Dict$moreBlack(c), |
| k, |
| v, |
| _elm_lang$core$Dict$lessBlackTree(l), |
| _elm_lang$core$Dict$lessBlackTree(r)) : A5(_elm_lang$core$Dict$RBNode_elm_builtin, c, k, v, l, r); |
| }); |
| var _elm_lang$core$Dict$removeMax = F5( |
| function (c, k, v, l, r) { |
| var _p28 = r; |
| if (_p28.ctor === 'RBEmpty_elm_builtin') { |
| return A3(_elm_lang$core$Dict$rem, c, l, r); |
| } else { |
| return A5( |
| _elm_lang$core$Dict$bubble, |
| c, |
| k, |
| v, |
| l, |
| A5(_elm_lang$core$Dict$removeMax, _p28._0, _p28._1, _p28._2, _p28._3, _p28._4)); |
| } |
| }); |
| var _elm_lang$core$Dict$rem = F3( |
| function (c, l, r) { |
| var _p29 = {ctor: '_Tuple2', _0: l, _1: r}; |
| if (_p29._0.ctor === 'RBEmpty_elm_builtin') { |
| if (_p29._1.ctor === 'RBEmpty_elm_builtin') { |
| var _p30 = c; |
| switch (_p30.ctor) { |
| case 'Red': |
| return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); |
| case 'Black': |
| return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBBlack); |
| default: |
| return _elm_lang$core$Native_Debug.crash('cannot have bblack or nblack nodes at this point'); |
| } |
| } else { |
| var _p33 = _p29._1._0; |
| var _p32 = _p29._0._0; |
| var _p31 = {ctor: '_Tuple3', _0: c, _1: _p32, _2: _p33}; |
| if ((((_p31.ctor === '_Tuple3') && (_p31._0.ctor === 'Black')) && (_p31._1.ctor === 'LBlack')) && (_p31._2.ctor === 'Red')) { |
| return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p29._1._1, _p29._1._2, _p29._1._3, _p29._1._4); |
| } else { |
| return A4( |
| _elm_lang$core$Dict$reportRemBug, |
| 'Black/LBlack/Red', |
| c, |
| _elm_lang$core$Basics$toString(_p32), |
| _elm_lang$core$Basics$toString(_p33)); |
| } |
| } |
| } else { |
| if (_p29._1.ctor === 'RBEmpty_elm_builtin') { |
| var _p36 = _p29._1._0; |
| var _p35 = _p29._0._0; |
| var _p34 = {ctor: '_Tuple3', _0: c, _1: _p35, _2: _p36}; |
| if ((((_p34.ctor === '_Tuple3') && (_p34._0.ctor === 'Black')) && (_p34._1.ctor === 'Red')) && (_p34._2.ctor === 'LBlack')) { |
| return A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Black, _p29._0._1, _p29._0._2, _p29._0._3, _p29._0._4); |
| } else { |
| return A4( |
| _elm_lang$core$Dict$reportRemBug, |
| 'Black/Red/LBlack', |
| c, |
| _elm_lang$core$Basics$toString(_p35), |
| _elm_lang$core$Basics$toString(_p36)); |
| } |
| } else { |
| var _p40 = _p29._0._2; |
| var _p39 = _p29._0._4; |
| var _p38 = _p29._0._1; |
| var l$ = A5(_elm_lang$core$Dict$removeMax, _p29._0._0, _p38, _p40, _p29._0._3, _p39); |
| var _p37 = A3(_elm_lang$core$Dict$maxWithDefault, _p38, _p40, _p39); |
| var k = _p37._0; |
| var v = _p37._1; |
| return A5(_elm_lang$core$Dict$bubble, c, k, v, l$, r); |
| } |
| } |
| }); |
| var _elm_lang$core$Dict$map = F2( |
| function (f, dict) { |
| var _p41 = dict; |
| if (_p41.ctor === 'RBEmpty_elm_builtin') { |
| return _elm_lang$core$Dict$RBEmpty_elm_builtin(_elm_lang$core$Dict$LBlack); |
| } else { |
| var _p42 = _p41._1; |
| return A5( |
| _elm_lang$core$Dict$RBNode_elm_builtin, |
| _p41._0, |
| _p42, |
| A2(f, _p42, _p41._2), |
| A2(_elm_lang$core$Dict$map, f, _p41._3), |
| A2(_elm_lang$core$Dict$map, f, _p41._4)); |
| } |
| }); |
| var _elm_lang$core$Dict$Same = {ctor: 'Same'}; |
| var _elm_lang$core$Dict$Remove = {ctor: 'Remove'}; |
| var _elm_lang$core$Dict$Insert = {ctor: 'Insert'}; |
| var _elm_lang$core$Dict$update = F3( |
| function (k, alter, dict) { |
| var up = function (dict) { |
| var _p43 = dict; |
| if (_p43.ctor === 'RBEmpty_elm_builtin') { |
| var _p44 = alter(_elm_lang$core$Maybe$Nothing); |
| if (_p44.ctor === 'Nothing') { |
| return {ctor: '_Tuple2', _0: _elm_lang$core$Dict$Same, _1: _elm_lang$core$Dict$empty}; |
| } else { |
| return { |
| ctor: '_Tuple2', |
| _0: _elm_lang$core$Dict$Insert, |
| _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _elm_lang$core$Dict$Red, k, _p44._0, _elm_lang$core$Dict$empty, _elm_lang$core$Dict$empty) |
| }; |
| } |
| } else { |
| var _p55 = _p43._2; |
| var _p54 = _p43._4; |
| var _p53 = _p43._3; |
| var _p52 = _p43._1; |
| var _p51 = _p43._0; |
| var _p45 = A2(_elm_lang$core$Basics$compare, k, _p52); |
| switch (_p45.ctor) { |
| case 'EQ': |
| var _p46 = alter( |
| _elm_lang$core$Maybe$Just(_p55)); |
| if (_p46.ctor === 'Nothing') { |
| return { |
| ctor: '_Tuple2', |
| _0: _elm_lang$core$Dict$Remove, |
| _1: A3(_elm_lang$core$Dict$rem, _p51, _p53, _p54) |
| }; |
| } else { |
| return { |
| ctor: '_Tuple2', |
| _0: _elm_lang$core$Dict$Same, |
| _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _p51, _p52, _p46._0, _p53, _p54) |
| }; |
| } |
| case 'LT': |
| var _p47 = up(_p53); |
| var flag = _p47._0; |
| var newLeft = _p47._1; |
| var _p48 = flag; |
| switch (_p48.ctor) { |
| case 'Same': |
| return { |
| ctor: '_Tuple2', |
| _0: _elm_lang$core$Dict$Same, |
| _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _p51, _p52, _p55, newLeft, _p54) |
| }; |
| case 'Insert': |
| return { |
| ctor: '_Tuple2', |
| _0: _elm_lang$core$Dict$Insert, |
| _1: A5(_elm_lang$core$Dict$balance, _p51, _p52, _p55, newLeft, _p54) |
| }; |
| default: |
| return { |
| ctor: '_Tuple2', |
| _0: _elm_lang$core$Dict$Remove, |
| _1: A5(_elm_lang$core$Dict$bubble, _p51, _p52, _p55, newLeft, _p54) |
| }; |
| } |
| default: |
| var _p49 = up(_p54); |
| var flag = _p49._0; |
| var newRight = _p49._1; |
| var _p50 = flag; |
| switch (_p50.ctor) { |
| case 'Same': |
| return { |
| ctor: '_Tuple2', |
| _0: _elm_lang$core$Dict$Same, |
| _1: A5(_elm_lang$core$Dict$RBNode_elm_builtin, _p51, _p52, _p55, _p53, newRight) |
| }; |
| case 'Insert': |
| return { |
| ctor: '_Tuple2', |
| _0: _elm_lang$core$Dict$Insert, |
| _1: A5(_elm_lang$core$Dict$balance, _p51, _p52, _p55, _p53, newRight) |
| }; |
| default: |
| return { |
| ctor: '_Tuple2', |
| _0: _elm_lang$core$Dict$Remove, |
| _1: A5(_elm_lang$core$Dict$bubble, _p51, _p52, _p55, _p53, newRight) |
| }; |
| } |
| } |
| } |
| }; |
| var _p56 = up(dict); |
| var flag = _p56._0; |
| var updatedDict = _p56._1; |
| var _p57 = flag; |
| switch (_p57.ctor) { |
| case 'Same': |
| return updatedDict; |
| case 'Insert': |
| return _elm_lang$core$Dict$ensureBlackRoot(updatedDict); |
| default: |
| return _elm_lang$core$Dict$blacken(updatedDict); |
| } |
| }); |
| var _elm_lang$core$Dict$insert = F3( |
| function (key, value, dict) { |
| return A3( |
| _elm_lang$core$Dict$update, |
| key, |
| _elm_lang$core$Basics$always( |
| _elm_lang$core$Maybe$Just(value)), |
| dict); |
| }); |
| var _elm_lang$core$Dict$singleton = F2( |
| function (key, value) { |
| return A3(_elm_lang$core$Dict$insert, key, value, _elm_lang$core$Dict$empty); |
| }); |
| var _elm_lang$core$Dict$union = F2( |
| function (t1, t2) { |
| return A3(_elm_lang$core$Dict$foldl, _elm_lang$core$Dict$insert, t2, t1); |
| }); |
| var _elm_lang$core$Dict$filter = F2( |
| function (predicate, dictionary) { |
| var add = F3( |
| function (key, value, dict) { |
| return A2(predicate, key, value) ? A3(_elm_lang$core$Dict$insert, key, value, dict) : dict; |
| }); |
| return A3(_elm_lang$core$Dict$foldl, add, _elm_lang$core$Dict$empty, dictionary); |
| }); |
| var _elm_lang$core$Dict$intersect = F2( |
| function (t1, t2) { |
| return A2( |
| _elm_lang$core$Dict$filter, |
| F2( |
| function (k, _p58) { |
| return A2(_elm_lang$core$Dict$member, k, t2); |
| }), |
| t1); |
| }); |
| var _elm_lang$core$Dict$partition = F2( |
| function (predicate, dict) { |
| var add = F3( |
| function (key, value, _p59) { |
| var _p60 = _p59; |
| var _p62 = _p60._1; |
| var _p61 = _p60._0; |
| return A2(predicate, key, value) ? { |
| ctor: '_Tuple2', |
| _0: A3(_elm_lang$core$Dict$insert, key, value, _p61), |
| _1: _p62 |
| } : { |
| ctor: '_Tuple2', |
| _0: _p61, |
| _1: A3(_elm_lang$core$Dict$insert, key, value, _p62) |
| }; |
| }); |
| return A3( |
| _elm_lang$core$Dict$foldl, |
| add, |
| {ctor: '_Tuple2', _0: _elm_lang$core$Dict$empty, _1: _elm_lang$core$Dict$empty}, |
| dict); |
| }); |
| var _elm_lang$core$Dict$fromList = function (assocs) { |
| return A3( |
| _elm_lang$core$List$foldl, |
| F2( |
| function (_p63, dict) { |
| var _p64 = _p63; |
| return A3(_elm_lang$core$Dict$insert, _p64._0, _p64._1, dict); |
| }), |
| _elm_lang$core$Dict$empty, |
| assocs); |
| }; |
| var _elm_lang$core$Dict$remove = F2( |
| function (key, dict) { |
| return A3( |
| _elm_lang$core$Dict$update, |
| key, |
| _elm_lang$core$Basics$always(_elm_lang$core$Maybe$Nothing), |
| dict); |
| }); |
| var _elm_lang$core$Dict$diff = F2( |
| function (t1, t2) { |
| return A3( |
| _elm_lang$core$Dict$foldl, |
| F3( |
| function (k, v, t) { |
| return A2(_elm_lang$core$Dict$remove, k, t); |
| }), |
| t1, |
| t2); |
| }); |
| |
| //import Native.Scheduler // |
| |
| var _elm_lang$core$Native_Time = function() { |
| |
| var now = _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) |
| { |
| callback(_elm_lang$core$Native_Scheduler.succeed(Date.now())); |
| }); |
| |
| function setInterval_(interval, task) |
| { |
| return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) |
| { |
| var id = setInterval(function() { |
| _elm_lang$core$Native_Scheduler.rawSpawn(task); |
| }, interval); |
| |
| return function() { clearInterval(id); }; |
| }); |
| } |
| |
| return { |
| now: now, |
| setInterval_: F2(setInterval_) |
| }; |
| |
| }(); |
| var _elm_lang$core$Time$setInterval = _elm_lang$core$Native_Time.setInterval_; |
| var _elm_lang$core$Time$spawnHelp = F3( |
| function (router, intervals, processes) { |
| var _p0 = intervals; |
| if (_p0.ctor === '[]') { |
| return _elm_lang$core$Task$succeed(processes); |
| } else { |
| var _p1 = _p0._0; |
| return A2( |
| _elm_lang$core$Task$andThen, |
| _elm_lang$core$Native_Scheduler.spawn( |
| A2( |
| _elm_lang$core$Time$setInterval, |
| _p1, |
| A2(_elm_lang$core$Platform$sendToSelf, router, _p1))), |
| function (id) { |
| return A3( |
| _elm_lang$core$Time$spawnHelp, |
| router, |
| _p0._1, |
| A3(_elm_lang$core$Dict$insert, _p1, id, processes)); |
| }); |
| } |
| }); |
| var _elm_lang$core$Time$addMySub = F2( |
| function (_p2, state) { |
| var _p3 = _p2; |
| var _p6 = _p3._1; |
| var _p5 = _p3._0; |
| var _p4 = A2(_elm_lang$core$Dict$get, _p5, state); |
| if (_p4.ctor === 'Nothing') { |
| return A3( |
| _elm_lang$core$Dict$insert, |
| _p5, |
| _elm_lang$core$Native_List.fromArray( |
| [_p6]), |
| state); |
| } else { |
| return A3( |
| _elm_lang$core$Dict$insert, |
| _p5, |
| A2(_elm_lang$core$List_ops['::'], _p6, _p4._0), |
| state); |
| } |
| }); |
| var _elm_lang$core$Time$inMilliseconds = function (t) { |
| return t; |
| }; |
| var _elm_lang$core$Time$millisecond = 1; |
| var _elm_lang$core$Time$second = 1000 * _elm_lang$core$Time$millisecond; |
| var _elm_lang$core$Time$minute = 60 * _elm_lang$core$Time$second; |
| var _elm_lang$core$Time$hour = 60 * _elm_lang$core$Time$minute; |
| var _elm_lang$core$Time$inHours = function (t) { |
| return t / _elm_lang$core$Time$hour; |
| }; |
| var _elm_lang$core$Time$inMinutes = function (t) { |
| return t / _elm_lang$core$Time$minute; |
| }; |
| var _elm_lang$core$Time$inSeconds = function (t) { |
| return t / _elm_lang$core$Time$second; |
| }; |
| var _elm_lang$core$Time$now = _elm_lang$core$Native_Time.now; |
| var _elm_lang$core$Time$onSelfMsg = F3( |
| function (router, interval, state) { |
| var _p7 = A2(_elm_lang$core$Dict$get, interval, state.taggers); |
| if (_p7.ctor === 'Nothing') { |
| return _elm_lang$core$Task$succeed(state); |
| } else { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| _elm_lang$core$Time$now, |
| function (time) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| _elm_lang$core$Task$sequence( |
| A2( |
| _elm_lang$core$List$map, |
| function (tagger) { |
| return A2( |
| _elm_lang$core$Platform$sendToApp, |
| router, |
| tagger(time)); |
| }, |
| _p7._0)), |
| function (_p8) { |
| return _elm_lang$core$Task$succeed(state); |
| }); |
| }); |
| } |
| }); |
| var _elm_lang$core$Time$subscription = _elm_lang$core$Native_Platform.leaf('Time'); |
| var _elm_lang$core$Time$State = F2( |
| function (a, b) { |
| return {taggers: a, processes: b}; |
| }); |
| var _elm_lang$core$Time$init = _elm_lang$core$Task$succeed( |
| A2(_elm_lang$core$Time$State, _elm_lang$core$Dict$empty, _elm_lang$core$Dict$empty)); |
| var _elm_lang$core$Time$onEffects = F3( |
| function (router, subs, _p9) { |
| var _p10 = _p9; |
| var rightStep = F3( |
| function (_p12, id, _p11) { |
| var _p13 = _p11; |
| return { |
| ctor: '_Tuple3', |
| _0: _p13._0, |
| _1: _p13._1, |
| _2: A2( |
| _elm_lang$core$Task$andThen, |
| _elm_lang$core$Native_Scheduler.kill(id), |
| function (_p14) { |
| return _p13._2; |
| }) |
| }; |
| }); |
| var bothStep = F4( |
| function (interval, taggers, id, _p15) { |
| var _p16 = _p15; |
| return { |
| ctor: '_Tuple3', |
| _0: _p16._0, |
| _1: A3(_elm_lang$core$Dict$insert, interval, id, _p16._1), |
| _2: _p16._2 |
| }; |
| }); |
| var leftStep = F3( |
| function (interval, taggers, _p17) { |
| var _p18 = _p17; |
| return { |
| ctor: '_Tuple3', |
| _0: A2(_elm_lang$core$List_ops['::'], interval, _p18._0), |
| _1: _p18._1, |
| _2: _p18._2 |
| }; |
| }); |
| var newTaggers = A3(_elm_lang$core$List$foldl, _elm_lang$core$Time$addMySub, _elm_lang$core$Dict$empty, subs); |
| var _p19 = A6( |
| _elm_lang$core$Dict$merge, |
| leftStep, |
| bothStep, |
| rightStep, |
| newTaggers, |
| _p10.processes, |
| { |
| ctor: '_Tuple3', |
| _0: _elm_lang$core$Native_List.fromArray( |
| []), |
| _1: _elm_lang$core$Dict$empty, |
| _2: _elm_lang$core$Task$succeed( |
| {ctor: '_Tuple0'}) |
| }); |
| var spawnList = _p19._0; |
| var existingDict = _p19._1; |
| var killTask = _p19._2; |
| return A2( |
| _elm_lang$core$Task$andThen, |
| killTask, |
| function (_p20) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| A3(_elm_lang$core$Time$spawnHelp, router, spawnList, existingDict), |
| function (newProcesses) { |
| return _elm_lang$core$Task$succeed( |
| A2(_elm_lang$core$Time$State, newTaggers, newProcesses)); |
| }); |
| }); |
| }); |
| var _elm_lang$core$Time$Every = F2( |
| function (a, b) { |
| return {ctor: 'Every', _0: a, _1: b}; |
| }); |
| var _elm_lang$core$Time$every = F2( |
| function (interval, tagger) { |
| return _elm_lang$core$Time$subscription( |
| A2(_elm_lang$core$Time$Every, interval, tagger)); |
| }); |
| var _elm_lang$core$Time$subMap = F2( |
| function (f, _p21) { |
| var _p22 = _p21; |
| return A2( |
| _elm_lang$core$Time$Every, |
| _p22._0, |
| function (_p23) { |
| return f( |
| _p22._1(_p23)); |
| }); |
| }); |
| _elm_lang$core$Native_Platform.effectManagers['Time'] = {pkg: 'elm-lang/core', init: _elm_lang$core$Time$init, onEffects: _elm_lang$core$Time$onEffects, onSelfMsg: _elm_lang$core$Time$onSelfMsg, tag: 'sub', subMap: _elm_lang$core$Time$subMap}; |
| |
| //import Maybe, Native.Array, Native.List, Native.Utils, Result // |
| |
| var _elm_lang$core$Native_Json = function() { |
| |
| |
| // CORE DECODERS |
| |
| function succeed(msg) |
| { |
| return { |
| ctor: '<decoder>', |
| tag: 'succeed', |
| msg: msg |
| }; |
| } |
| |
| function fail(msg) |
| { |
| return { |
| ctor: '<decoder>', |
| tag: 'fail', |
| msg: msg |
| }; |
| } |
| |
| function decodePrimitive(tag) |
| { |
| return { |
| ctor: '<decoder>', |
| tag: tag |
| }; |
| } |
| |
| function decodeContainer(tag, decoder) |
| { |
| return { |
| ctor: '<decoder>', |
| tag: tag, |
| decoder: decoder |
| }; |
| } |
| |
| function decodeNull(value) |
| { |
| return { |
| ctor: '<decoder>', |
| tag: 'null', |
| value: value |
| }; |
| } |
| |
| function decodeField(field, decoder) |
| { |
| return { |
| ctor: '<decoder>', |
| tag: 'field', |
| field: field, |
| decoder: decoder |
| }; |
| } |
| |
| function decodeKeyValuePairs(decoder) |
| { |
| return { |
| ctor: '<decoder>', |
| tag: 'key-value', |
| decoder: decoder |
| }; |
| } |
| |
| function decodeObject(f, decoders) |
| { |
| return { |
| ctor: '<decoder>', |
| tag: 'map-many', |
| func: f, |
| decoders: decoders |
| }; |
| } |
| |
| function decodeTuple(f, decoders) |
| { |
| return { |
| ctor: '<decoder>', |
| tag: 'tuple', |
| func: f, |
| decoders: decoders |
| }; |
| } |
| |
| function andThen(decoder, callback) |
| { |
| return { |
| ctor: '<decoder>', |
| tag: 'andThen', |
| decoder: decoder, |
| callback: callback |
| }; |
| } |
| |
| function customAndThen(decoder, callback) |
| { |
| return { |
| ctor: '<decoder>', |
| tag: 'customAndThen', |
| decoder: decoder, |
| callback: callback |
| }; |
| } |
| |
| function oneOf(decoders) |
| { |
| return { |
| ctor: '<decoder>', |
| tag: 'oneOf', |
| decoders: decoders |
| }; |
| } |
| |
| |
| // DECODING OBJECTS |
| |
| function decodeObject1(f, d1) |
| { |
| return decodeObject(f, [d1]); |
| } |
| |
| function decodeObject2(f, d1, d2) |
| { |
| return decodeObject(f, [d1, d2]); |
| } |
| |
| function decodeObject3(f, d1, d2, d3) |
| { |
| return decodeObject(f, [d1, d2, d3]); |
| } |
| |
| function decodeObject4(f, d1, d2, d3, d4) |
| { |
| return decodeObject(f, [d1, d2, d3, d4]); |
| } |
| |
| function decodeObject5(f, d1, d2, d3, d4, d5) |
| { |
| return decodeObject(f, [d1, d2, d3, d4, d5]); |
| } |
| |
| function decodeObject6(f, d1, d2, d3, d4, d5, d6) |
| { |
| return decodeObject(f, [d1, d2, d3, d4, d5, d6]); |
| } |
| |
| function decodeObject7(f, d1, d2, d3, d4, d5, d6, d7) |
| { |
| return decodeObject(f, [d1, d2, d3, d4, d5, d6, d7]); |
| } |
| |
| function decodeObject8(f, d1, d2, d3, d4, d5, d6, d7, d8) |
| { |
| return decodeObject(f, [d1, d2, d3, d4, d5, d6, d7, d8]); |
| } |
| |
| |
| // DECODING TUPLES |
| |
| function decodeTuple1(f, d1) |
| { |
| return decodeTuple(f, [d1]); |
| } |
| |
| function decodeTuple2(f, d1, d2) |
| { |
| return decodeTuple(f, [d1, d2]); |
| } |
| |
| function decodeTuple3(f, d1, d2, d3) |
| { |
| return decodeTuple(f, [d1, d2, d3]); |
| } |
| |
| function decodeTuple4(f, d1, d2, d3, d4) |
| { |
| return decodeTuple(f, [d1, d2, d3, d4]); |
| } |
| |
| function decodeTuple5(f, d1, d2, d3, d4, d5) |
| { |
| return decodeTuple(f, [d1, d2, d3, d4, d5]); |
| } |
| |
| function decodeTuple6(f, d1, d2, d3, d4, d5, d6) |
| { |
| return decodeTuple(f, [d1, d2, d3, d4, d5, d6]); |
| } |
| |
| function decodeTuple7(f, d1, d2, d3, d4, d5, d6, d7) |
| { |
| return decodeTuple(f, [d1, d2, d3, d4, d5, d6, d7]); |
| } |
| |
| function decodeTuple8(f, d1, d2, d3, d4, d5, d6, d7, d8) |
| { |
| return decodeTuple(f, [d1, d2, d3, d4, d5, d6, d7, d8]); |
| } |
| |
| |
| // DECODE HELPERS |
| |
| function ok(value) |
| { |
| return { tag: 'ok', value: value }; |
| } |
| |
| function badPrimitive(type, value) |
| { |
| return { tag: 'primitive', type: type, value: value }; |
| } |
| |
| function badIndex(index, nestedProblems) |
| { |
| return { tag: 'index', index: index, rest: nestedProblems }; |
| } |
| |
| function badField(field, nestedProblems) |
| { |
| return { tag: 'field', field: field, rest: nestedProblems }; |
| } |
| |
| function badOneOf(problems) |
| { |
| return { tag: 'oneOf', problems: problems }; |
| } |
| |
| function badCustom(msg) |
| { |
| return { tag: 'custom', msg: msg }; |
| } |
| |
| function bad(msg) |
| { |
| return { tag: 'fail', msg: msg }; |
| } |
| |
| function badToString(problem) |
| { |
| var context = '_'; |
| while (problem) |
| { |
| switch (problem.tag) |
| { |
| case 'primitive': |
| return 'Expecting ' + problem.type |
| + (context === '_' ? '' : ' at ' + context) |
| + ' but instead got: ' + jsToString(problem.value); |
| |
| case 'index': |
| context += '[' + problem.index + ']'; |
| problem = problem.rest; |
| break; |
| |
| case 'field': |
| context += '.' + problem.field; |
| problem = problem.rest; |
| break; |
| |
| case 'oneOf': |
| var problems = problem.problems; |
| for (var i = 0; i < problems.length; i++) |
| { |
| problems[i] = badToString(problems[i]); |
| } |
| return 'I ran into the following problems' |
| + (context === '_' ? '' : ' at ' + context) |
| + ':\n\n' + problems.join('\n'); |
| |
| case 'custom': |
| return 'A `customDecoder` failed' |
| + (context === '_' ? '' : ' at ' + context) |
| + ' with the message: ' + problem.msg; |
| |
| case 'fail': |
| return 'I ran into a `fail` decoder' |
| + (context === '_' ? '' : ' at ' + context) |
| + ': ' + problem.msg; |
| } |
| } |
| } |
| |
| function jsToString(value) |
| { |
| return value === undefined |
| ? 'undefined' |
| : JSON.stringify(value); |
| } |
| |
| |
| // DECODE |
| |
| function runOnString(decoder, string) |
| { |
| var json; |
| try |
| { |
| json = JSON.parse(string); |
| } |
| catch (e) |
| { |
| return _elm_lang$core$Result$Err('Given an invalid JSON: ' + e.message); |
| } |
| return run(decoder, json); |
| } |
| |
| function run(decoder, value) |
| { |
| var result = runHelp(decoder, value); |
| return (result.tag === 'ok') |
| ? _elm_lang$core$Result$Ok(result.value) |
| : _elm_lang$core$Result$Err(badToString(result)); |
| } |
| |
| function runHelp(decoder, value) |
| { |
| switch (decoder.tag) |
| { |
| case 'bool': |
| return (typeof value === 'boolean') |
| ? ok(value) |
| : badPrimitive('a Bool', value); |
| |
| case 'int': |
| if (typeof value !== 'number') { |
| return badPrimitive('an Int', value); |
| } |
| |
| if (-2147483647 < value && value < 2147483647 && (value | 0) === value) { |
| return ok(value); |
| } |
| |
| if (isFinite(value) && !(value % 1)) { |
| return ok(value); |
| } |
| |
| return badPrimitive('an Int', value); |
| |
| case 'float': |
| return (typeof value === 'number') |
| ? ok(value) |
| : badPrimitive('a Float', value); |
| |
| case 'string': |
| return (typeof value === 'string') |
| ? ok(value) |
| : (value instanceof String) |
| ? ok(value + '') |
| : badPrimitive('a String', value); |
| |
| case 'null': |
| return (value === null) |
| ? ok(decoder.value) |
| : badPrimitive('null', value); |
| |
| case 'value': |
| return ok(value); |
| |
| case 'list': |
| if (!(value instanceof Array)) |
| { |
| return badPrimitive('a List', value); |
| } |
| |
| var list = _elm_lang$core$Native_List.Nil; |
| for (var i = value.length; i--; ) |
| { |
| var result = runHelp(decoder.decoder, value[i]); |
| if (result.tag !== 'ok') |
| { |
| return badIndex(i, result) |
| } |
| list = _elm_lang$core$Native_List.Cons(result.value, list); |
| } |
| return ok(list); |
| |
| case 'array': |
| if (!(value instanceof Array)) |
| { |
| return badPrimitive('an Array', value); |
| } |
| |
| var len = value.length; |
| var array = new Array(len); |
| for (var i = len; i--; ) |
| { |
| var result = runHelp(decoder.decoder, value[i]); |
| if (result.tag !== 'ok') |
| { |
| return badIndex(i, result); |
| } |
| array[i] = result.value; |
| } |
| return ok(_elm_lang$core$Native_Array.fromJSArray(array)); |
| |
| case 'maybe': |
| var result = runHelp(decoder.decoder, value); |
| return (result.tag === 'ok') |
| ? ok(_elm_lang$core$Maybe$Just(result.value)) |
| : ok(_elm_lang$core$Maybe$Nothing); |
| |
| case 'field': |
| var field = decoder.field; |
| if (typeof value !== 'object' || value === null || !(field in value)) |
| { |
| return badPrimitive('an object with a field named `' + field + '`', value); |
| } |
| |
| var result = runHelp(decoder.decoder, value[field]); |
| return (result.tag === 'ok') |
| ? result |
| : badField(field, result); |
| |
| case 'key-value': |
| if (typeof value !== 'object' || value === null || value instanceof Array) |
| { |
| return badPrimitive('an object', value); |
| } |
| |
| var keyValuePairs = _elm_lang$core$Native_List.Nil; |
| for (var key in value) |
| { |
| var result = runHelp(decoder.decoder, value[key]); |
| if (result.tag !== 'ok') |
| { |
| return badField(key, result); |
| } |
| var pair = _elm_lang$core$Native_Utils.Tuple2(key, result.value); |
| keyValuePairs = _elm_lang$core$Native_List.Cons(pair, keyValuePairs); |
| } |
| return ok(keyValuePairs); |
| |
| case 'map-many': |
| var answer = decoder.func; |
| var decoders = decoder.decoders; |
| for (var i = 0; i < decoders.length; i++) |
| { |
| var result = runHelp(decoders[i], value); |
| if (result.tag !== 'ok') |
| { |
| return result; |
| } |
| answer = answer(result.value); |
| } |
| return ok(answer); |
| |
| case 'tuple': |
| var decoders = decoder.decoders; |
| var len = decoders.length; |
| |
| if ( !(value instanceof Array) || value.length !== len ) |
| { |
| return badPrimitive('a Tuple with ' + len + ' entries', value); |
| } |
| |
| var answer = decoder.func; |
| for (var i = 0; i < len; i++) |
| { |
| var result = runHelp(decoders[i], value[i]); |
| if (result.tag !== 'ok') |
| { |
| return badIndex(i, result); |
| } |
| answer = answer(result.value); |
| } |
| return ok(answer); |
| |
| case 'customAndThen': |
| var result = runHelp(decoder.decoder, value); |
| if (result.tag !== 'ok') |
| { |
| return result; |
| } |
| var realResult = decoder.callback(result.value); |
| if (realResult.ctor === 'Err') |
| { |
| return badCustom(realResult._0); |
| } |
| return ok(realResult._0); |
| |
| case 'andThen': |
| var result = runHelp(decoder.decoder, value); |
| return (result.tag !== 'ok') |
| ? result |
| : runHelp(decoder.callback(result.value), value); |
| |
| case 'oneOf': |
| var errors = []; |
| var temp = decoder.decoders; |
| while (temp.ctor !== '[]') |
| { |
| var result = runHelp(temp._0, value); |
| |
| if (result.tag === 'ok') |
| { |
| return result; |
| } |
| |
| errors.push(result); |
| |
| temp = temp._1; |
| } |
| return badOneOf(errors); |
| |
| case 'fail': |
| return bad(decoder.msg); |
| |
| case 'succeed': |
| return ok(decoder.msg); |
| } |
| } |
| |
| |
| // EQUALITY |
| |
| function equality(a, b) |
| { |
| if (a === b) |
| { |
| return true; |
| } |
| |
| if (a.tag !== b.tag) |
| { |
| return false; |
| } |
| |
| switch (a.tag) |
| { |
| case 'succeed': |
| case 'fail': |
| return a.msg === b.msg; |
| |
| case 'bool': |
| case 'int': |
| case 'float': |
| case 'string': |
| case 'value': |
| return true; |
| |
| case 'null': |
| return a.value === b.value; |
| |
| case 'list': |
| case 'array': |
| case 'maybe': |
| case 'key-value': |
| return equality(a.decoder, b.decoder); |
| |
| case 'field': |
| return a.field === b.field && equality(a.decoder, b.decoder); |
| |
| case 'map-many': |
| case 'tuple': |
| if (a.func !== b.func) |
| { |
| return false; |
| } |
| return listEquality(a.decoders, b.decoders); |
| |
| case 'andThen': |
| case 'customAndThen': |
| return a.callback === b.callback && equality(a.decoder, b.decoder); |
| |
| case 'oneOf': |
| return listEquality(a.decoders, b.decoders); |
| } |
| } |
| |
| function listEquality(aDecoders, bDecoders) |
| { |
| var len = aDecoders.length; |
| if (len !== bDecoders.length) |
| { |
| return false; |
| } |
| for (var i = 0; i < len; i++) |
| { |
| if (!equality(aDecoders[i], bDecoders[i])) |
| { |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| |
| // ENCODE |
| |
| function encode(indentLevel, value) |
| { |
| return JSON.stringify(value, null, indentLevel); |
| } |
| |
| function identity(value) |
| { |
| return value; |
| } |
| |
| function encodeObject(keyValuePairs) |
| { |
| var obj = {}; |
| while (keyValuePairs.ctor !== '[]') |
| { |
| var pair = keyValuePairs._0; |
| obj[pair._0] = pair._1; |
| keyValuePairs = keyValuePairs._1; |
| } |
| return obj; |
| } |
| |
| return { |
| encode: F2(encode), |
| runOnString: F2(runOnString), |
| run: F2(run), |
| |
| decodeNull: decodeNull, |
| decodePrimitive: decodePrimitive, |
| decodeContainer: F2(decodeContainer), |
| |
| decodeField: F2(decodeField), |
| |
| decodeObject1: F2(decodeObject1), |
| decodeObject2: F3(decodeObject2), |
| decodeObject3: F4(decodeObject3), |
| decodeObject4: F5(decodeObject4), |
| decodeObject5: F6(decodeObject5), |
| decodeObject6: F7(decodeObject6), |
| decodeObject7: F8(decodeObject7), |
| decodeObject8: F9(decodeObject8), |
| decodeKeyValuePairs: decodeKeyValuePairs, |
| |
| decodeTuple1: F2(decodeTuple1), |
| decodeTuple2: F3(decodeTuple2), |
| decodeTuple3: F4(decodeTuple3), |
| decodeTuple4: F5(decodeTuple4), |
| decodeTuple5: F6(decodeTuple5), |
| decodeTuple6: F7(decodeTuple6), |
| decodeTuple7: F8(decodeTuple7), |
| decodeTuple8: F9(decodeTuple8), |
| |
| andThen: F2(andThen), |
| customAndThen: F2(customAndThen), |
| fail: fail, |
| succeed: succeed, |
| oneOf: oneOf, |
| |
| identity: identity, |
| encodeNull: null, |
| encodeArray: _elm_lang$core$Native_Array.toJSArray, |
| encodeList: _elm_lang$core$Native_List.toArray, |
| encodeObject: encodeObject, |
| |
| equality: equality |
| }; |
| |
| }(); |
| |
| var _elm_lang$core$Json_Encode$list = _elm_lang$core$Native_Json.encodeList; |
| var _elm_lang$core$Json_Encode$array = _elm_lang$core$Native_Json.encodeArray; |
| var _elm_lang$core$Json_Encode$object = _elm_lang$core$Native_Json.encodeObject; |
| var _elm_lang$core$Json_Encode$null = _elm_lang$core$Native_Json.encodeNull; |
| var _elm_lang$core$Json_Encode$bool = _elm_lang$core$Native_Json.identity; |
| var _elm_lang$core$Json_Encode$float = _elm_lang$core$Native_Json.identity; |
| var _elm_lang$core$Json_Encode$int = _elm_lang$core$Native_Json.identity; |
| var _elm_lang$core$Json_Encode$string = _elm_lang$core$Native_Json.identity; |
| var _elm_lang$core$Json_Encode$encode = _elm_lang$core$Native_Json.encode; |
| var _elm_lang$core$Json_Encode$Value = {ctor: 'Value'}; |
| |
| var _elm_lang$core$Json_Decode$tuple8 = _elm_lang$core$Native_Json.decodeTuple8; |
| var _elm_lang$core$Json_Decode$tuple7 = _elm_lang$core$Native_Json.decodeTuple7; |
| var _elm_lang$core$Json_Decode$tuple6 = _elm_lang$core$Native_Json.decodeTuple6; |
| var _elm_lang$core$Json_Decode$tuple5 = _elm_lang$core$Native_Json.decodeTuple5; |
| var _elm_lang$core$Json_Decode$tuple4 = _elm_lang$core$Native_Json.decodeTuple4; |
| var _elm_lang$core$Json_Decode$tuple3 = _elm_lang$core$Native_Json.decodeTuple3; |
| var _elm_lang$core$Json_Decode$tuple2 = _elm_lang$core$Native_Json.decodeTuple2; |
| var _elm_lang$core$Json_Decode$tuple1 = _elm_lang$core$Native_Json.decodeTuple1; |
| var _elm_lang$core$Json_Decode$succeed = _elm_lang$core$Native_Json.succeed; |
| var _elm_lang$core$Json_Decode$fail = _elm_lang$core$Native_Json.fail; |
| var _elm_lang$core$Json_Decode$andThen = _elm_lang$core$Native_Json.andThen; |
| var _elm_lang$core$Json_Decode$customDecoder = _elm_lang$core$Native_Json.customAndThen; |
| var _elm_lang$core$Json_Decode$decodeValue = _elm_lang$core$Native_Json.run; |
| var _elm_lang$core$Json_Decode$value = _elm_lang$core$Native_Json.decodePrimitive('value'); |
| var _elm_lang$core$Json_Decode$maybe = function (decoder) { |
| return A2(_elm_lang$core$Native_Json.decodeContainer, 'maybe', decoder); |
| }; |
| var _elm_lang$core$Json_Decode$null = _elm_lang$core$Native_Json.decodeNull; |
| var _elm_lang$core$Json_Decode$array = function (decoder) { |
| return A2(_elm_lang$core$Native_Json.decodeContainer, 'array', decoder); |
| }; |
| var _elm_lang$core$Json_Decode$list = function (decoder) { |
| return A2(_elm_lang$core$Native_Json.decodeContainer, 'list', decoder); |
| }; |
| var _elm_lang$core$Json_Decode$bool = _elm_lang$core$Native_Json.decodePrimitive('bool'); |
| var _elm_lang$core$Json_Decode$int = _elm_lang$core$Native_Json.decodePrimitive('int'); |
| var _elm_lang$core$Json_Decode$float = _elm_lang$core$Native_Json.decodePrimitive('float'); |
| var _elm_lang$core$Json_Decode$string = _elm_lang$core$Native_Json.decodePrimitive('string'); |
| var _elm_lang$core$Json_Decode$oneOf = _elm_lang$core$Native_Json.oneOf; |
| var _elm_lang$core$Json_Decode$keyValuePairs = _elm_lang$core$Native_Json.decodeKeyValuePairs; |
| var _elm_lang$core$Json_Decode$object8 = _elm_lang$core$Native_Json.decodeObject8; |
| var _elm_lang$core$Json_Decode$object7 = _elm_lang$core$Native_Json.decodeObject7; |
| var _elm_lang$core$Json_Decode$object6 = _elm_lang$core$Native_Json.decodeObject6; |
| var _elm_lang$core$Json_Decode$object5 = _elm_lang$core$Native_Json.decodeObject5; |
| var _elm_lang$core$Json_Decode$object4 = _elm_lang$core$Native_Json.decodeObject4; |
| var _elm_lang$core$Json_Decode$object3 = _elm_lang$core$Native_Json.decodeObject3; |
| var _elm_lang$core$Json_Decode$object2 = _elm_lang$core$Native_Json.decodeObject2; |
| var _elm_lang$core$Json_Decode$object1 = _elm_lang$core$Native_Json.decodeObject1; |
| var _elm_lang$core$Json_Decode_ops = _elm_lang$core$Json_Decode_ops || {}; |
| _elm_lang$core$Json_Decode_ops[':='] = _elm_lang$core$Native_Json.decodeField; |
| var _elm_lang$core$Json_Decode$at = F2( |
| function (fields, decoder) { |
| return A3( |
| _elm_lang$core$List$foldr, |
| F2( |
| function (x, y) { |
| return A2(_elm_lang$core$Json_Decode_ops[':='], x, y); |
| }), |
| decoder, |
| fields); |
| }); |
| var _elm_lang$core$Json_Decode$decodeString = _elm_lang$core$Native_Json.runOnString; |
| var _elm_lang$core$Json_Decode$map = _elm_lang$core$Native_Json.decodeObject1; |
| var _elm_lang$core$Json_Decode$dict = function (decoder) { |
| return A2( |
| _elm_lang$core$Json_Decode$map, |
| _elm_lang$core$Dict$fromList, |
| _elm_lang$core$Json_Decode$keyValuePairs(decoder)); |
| }; |
| var _elm_lang$core$Json_Decode$Decoder = {ctor: 'Decoder'}; |
| |
| var _elm_lang$core$Process$kill = _elm_lang$core$Native_Scheduler.kill; |
| var _elm_lang$core$Process$sleep = _elm_lang$core$Native_Scheduler.sleep; |
| var _elm_lang$core$Process$spawn = _elm_lang$core$Native_Scheduler.spawn; |
| |
| var _elm_lang$dom$Native_Dom = function() { |
| |
| function on(node) |
| { |
| return function(eventName, decoder, toTask) |
| { |
| return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) { |
| |
| function performTask(event) |
| { |
| var result = A2(_elm_lang$core$Json_Decode$decodeValue, decoder, event); |
| if (result.ctor === 'Ok') |
| { |
| _elm_lang$core$Native_Scheduler.rawSpawn(toTask(result._0)); |
| } |
| } |
| |
| node.addEventListener(eventName, performTask); |
| |
| return function() |
| { |
| node.removeEventListener(eventName, performTask); |
| }; |
| }); |
| }; |
| } |
| |
| var rAF = function(callback) { callback(); }; |
| |
| function withNode(id, doStuff) |
| { |
| return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) |
| { |
| rAF(function() |
| { |
| var node = document.getElementById(id); |
| if (node === null) |
| { |
| callback(_elm_lang$core$Native_Scheduler.fail({ ctor: 'NotFound', _0: id })); |
| return; |
| } |
| callback(_elm_lang$core$Native_Scheduler.succeed(doStuff(node))); |
| }); |
| }); |
| } |
| |
| |
| // FOCUS |
| |
| function focus(id) |
| { |
| return withNode(id, function(node) { |
| node.focus(); |
| return _elm_lang$core$Native_Utils.Tuple0; |
| }); |
| } |
| |
| function blur(id) |
| { |
| return withNode(id, function(node) { |
| node.blur(); |
| return _elm_lang$core$Native_Utils.Tuple0; |
| }); |
| } |
| |
| |
| // SCROLLING |
| |
| function getScrollTop(id) |
| { |
| return withNode(id, function(node) { |
| return node.scrollTop; |
| }); |
| } |
| |
| function setScrollTop(id, desiredScrollTop) |
| { |
| return withNode(id, function(node) { |
| node.scrollTop = desiredScrollTop; |
| return _elm_lang$core$Native_Utils.Tuple0; |
| }); |
| } |
| |
| function toBottom(id) |
| { |
| return withNode(id, function(node) { |
| node.scrollTop = node.scrollHeight; |
| return _elm_lang$core$Native_Utils.Tuple0; |
| }); |
| } |
| |
| function getScrollLeft(id) |
| { |
| return withNode(id, function(node) { |
| return node.scrollLeft; |
| }); |
| } |
| |
| function setScrollLeft(id, desiredScrollLeft) |
| { |
| return withNode(id, function(node) { |
| node.scrollLeft = desiredScrollLeft; |
| return _elm_lang$core$Native_Utils.Tuple0; |
| }); |
| } |
| |
| function toRight(id) |
| { |
| return withNode(id, function(node) { |
| node.scrollLeft = node.scrollWidth; |
| return _elm_lang$core$Native_Utils.Tuple0; |
| }); |
| } |
| |
| |
| // SIZE |
| |
| function width(options, id) |
| { |
| return withNode(id, function(node) { |
| switch (options.ctor) |
| { |
| case 'Content': |
| return node.scrollWidth; |
| case 'VisibleContent': |
| return node.clientWidth; |
| case 'VisibleContentWithBorders': |
| return node.offsetWidth; |
| case 'VisibleContentWithBordersAndMargins': |
| var rect = node.getBoundingClientRect(); |
| return rect.right - rect.left; |
| } |
| }); |
| } |
| |
| function height(options, id) |
| { |
| return withNode(id, function(node) { |
| switch (options.ctor) |
| { |
| case 'Content': |
| return node.scrollHeight; |
| case 'VisibleContent': |
| return node.clientHeight; |
| case 'VisibleContentWithBorders': |
| return node.offsetHeight; |
| case 'VisibleContentWithBordersAndMargins': |
| var rect = node.getBoundingClientRect(); |
| return rect.bottom - rect.top; |
| } |
| }); |
| } |
| |
| return { |
| onDocument: F3(on(document)), |
| onWindow: F3(on(window)), |
| |
| focus: focus, |
| blur: blur, |
| |
| getScrollTop: getScrollTop, |
| setScrollTop: F2(setScrollTop), |
| getScrollLeft: getScrollLeft, |
| setScrollLeft: F2(setScrollLeft), |
| toBottom: toBottom, |
| toRight: toRight, |
| |
| height: F2(height), |
| width: F2(width) |
| }; |
| |
| }(); |
| |
| var _elm_lang$dom$Dom$blur = _elm_lang$dom$Native_Dom.blur; |
| var _elm_lang$dom$Dom$focus = _elm_lang$dom$Native_Dom.focus; |
| var _elm_lang$dom$Dom$NotFound = function (a) { |
| return {ctor: 'NotFound', _0: a}; |
| }; |
| |
| var _elm_lang$dom$Dom_LowLevel$onWindow = _elm_lang$dom$Native_Dom.onWindow; |
| var _elm_lang$dom$Dom_LowLevel$onDocument = _elm_lang$dom$Native_Dom.onDocument; |
| |
| //import Native.Json // |
| |
| var _elm_lang$virtual_dom$Native_VirtualDom = function() { |
| |
| var STYLE_KEY = 'STYLE'; |
| var EVENT_KEY = 'EVENT'; |
| var ATTR_KEY = 'ATTR'; |
| var ATTR_NS_KEY = 'ATTR_NS'; |
| |
| |
| |
| //////////// VIRTUAL DOM NODES //////////// |
| |
| |
| function text(string) |
| { |
| return { |
| type: 'text', |
| text: string |
| }; |
| } |
| |
| |
| function node(tag) |
| { |
| return F2(function(factList, kidList) { |
| return nodeHelp(tag, factList, kidList); |
| }); |
| } |
| |
| |
| function nodeHelp(tag, factList, kidList) |
| { |
| var organized = organizeFacts(factList); |
| var namespace = organized.namespace; |
| var facts = organized.facts; |
| |
| var children = []; |
| var descendantsCount = 0; |
| while (kidList.ctor !== '[]') |
| { |
| var kid = kidList._0; |
| descendantsCount += (kid.descendantsCount || 0); |
| children.push(kid); |
| kidList = kidList._1; |
| } |
| descendantsCount += children.length; |
| |
| return { |
| type: 'node', |
| tag: tag, |
| facts: facts, |
| children: children, |
| namespace: namespace, |
| descendantsCount: descendantsCount |
| }; |
| } |
| |
| |
| function keyedNode(tag, factList, kidList) |
| { |
| var organized = organizeFacts(factList); |
| var namespace = organized.namespace; |
| var facts = organized.facts; |
| |
| var children = []; |
| var descendantsCount = 0; |
| while (kidList.ctor !== '[]') |
| { |
| var kid = kidList._0; |
| descendantsCount += (kid._1.descendantsCount || 0); |
| children.push(kid); |
| kidList = kidList._1; |
| } |
| descendantsCount += children.length; |
| |
| return { |
| type: 'keyed-node', |
| tag: tag, |
| facts: facts, |
| children: children, |
| namespace: namespace, |
| descendantsCount: descendantsCount |
| }; |
| } |
| |
| |
| function custom(factList, model, impl) |
| { |
| var facts = organizeFacts(factList).facts; |
| |
| return { |
| type: 'custom', |
| facts: facts, |
| model: model, |
| impl: impl |
| }; |
| } |
| |
| |
| function map(tagger, node) |
| { |
| return { |
| type: 'tagger', |
| tagger: tagger, |
| node: node, |
| descendantsCount: 1 + (node.descendantsCount || 0) |
| }; |
| } |
| |
| |
| function thunk(func, args, thunk) |
| { |
| return { |
| type: 'thunk', |
| func: func, |
| args: args, |
| thunk: thunk, |
| node: undefined |
| }; |
| } |
| |
| function lazy(fn, a) |
| { |
| return thunk(fn, [a], function() { |
| return fn(a); |
| }); |
| } |
| |
| function lazy2(fn, a, b) |
| { |
| return thunk(fn, [a,b], function() { |
| return A2(fn, a, b); |
| }); |
| } |
| |
| function lazy3(fn, a, b, c) |
| { |
| return thunk(fn, [a,b,c], function() { |
| return A3(fn, a, b, c); |
| }); |
| } |
| |
| |
| |
| // FACTS |
| |
| |
| function organizeFacts(factList) |
| { |
| var namespace, facts = {}; |
| |
| while (factList.ctor !== '[]') |
| { |
| var entry = factList._0; |
| var key = entry.key; |
| |
| if (key === ATTR_KEY || key === ATTR_NS_KEY || key === EVENT_KEY) |
| { |
| var subFacts = facts[key] || {}; |
| subFacts[entry.realKey] = entry.value; |
| facts[key] = subFacts; |
| } |
| else if (key === STYLE_KEY) |
| { |
| var styles = facts[key] || {}; |
| var styleList = entry.value; |
| while (styleList.ctor !== '[]') |
| { |
| var style = styleList._0; |
| styles[style._0] = style._1; |
| styleList = styleList._1; |
| } |
| facts[key] = styles; |
| } |
| else if (key === 'namespace') |
| { |
| namespace = entry.value; |
| } |
| else |
| { |
| facts[key] = entry.value; |
| } |
| factList = factList._1; |
| } |
| |
| return { |
| facts: facts, |
| namespace: namespace |
| }; |
| } |
| |
| |
| |
| //////////// PROPERTIES AND ATTRIBUTES //////////// |
| |
| |
| function style(value) |
| { |
| return { |
| key: STYLE_KEY, |
| value: value |
| }; |
| } |
| |
| |
| function property(key, value) |
| { |
| return { |
| key: key, |
| value: value |
| }; |
| } |
| |
| |
| function attribute(key, value) |
| { |
| return { |
| key: ATTR_KEY, |
| realKey: key, |
| value: value |
| }; |
| } |
| |
| |
| function attributeNS(namespace, key, value) |
| { |
| return { |
| key: ATTR_NS_KEY, |
| realKey: key, |
| value: { |
| value: value, |
| namespace: namespace |
| } |
| }; |
| } |
| |
| |
| function on(name, options, decoder) |
| { |
| return { |
| key: EVENT_KEY, |
| realKey: name, |
| value: { |
| options: options, |
| decoder: decoder |
| } |
| }; |
| } |
| |
| |
| function equalEvents(a, b) |
| { |
| if (!a.options === b.options) |
| { |
| if (a.stopPropagation !== b.stopPropagation || a.preventDefault !== b.preventDefault) |
| { |
| return false; |
| } |
| } |
| return _elm_lang$core$Native_Json.equality(a.decoder, b.decoder); |
| } |
| |
| |
| |
| //////////// RENDERER //////////// |
| |
| |
| function renderer(parent, tagger, initialVirtualNode) |
| { |
| var eventNode = { tagger: tagger, parent: undefined }; |
| |
| var domNode = render(initialVirtualNode, eventNode); |
| parent.appendChild(domNode); |
| |
| var state = 'NO_REQUEST'; |
| var currentVirtualNode = initialVirtualNode; |
| var nextVirtualNode = initialVirtualNode; |
| |
| function registerVirtualNode(vNode) |
| { |
| if (state === 'NO_REQUEST') |
| { |
| rAF(updateIfNeeded); |
| } |
| state = 'PENDING_REQUEST'; |
| nextVirtualNode = vNode; |
| } |
| |
| function updateIfNeeded() |
| { |
| switch (state) |
| { |
| case 'NO_REQUEST': |
| throw new Error( |
| 'Unexpected draw callback.\n' + |
| 'Please report this to <https://github.com/elm-lang/core/issues>.' |
| ); |
| |
| case 'PENDING_REQUEST': |
| rAF(updateIfNeeded); |
| state = 'EXTRA_REQUEST'; |
| |
| var patches = diff(currentVirtualNode, nextVirtualNode); |
| domNode = applyPatches(domNode, currentVirtualNode, patches, eventNode); |
| currentVirtualNode = nextVirtualNode; |
| |
| return; |
| |
| case 'EXTRA_REQUEST': |
| state = 'NO_REQUEST'; |
| return; |
| } |
| } |
| |
| return { update: registerVirtualNode }; |
| } |
| |
| |
| window.rAFCallbackList = []; |
| var rAF = function (callback) { |
| window.rAFCallbackList.push(callback); |
| } |
| |
| |
| |
| //////////// RENDER //////////// |
| |
| |
| function render(vNode, eventNode) |
| { |
| switch (vNode.type) |
| { |
| case 'thunk': |
| if (!vNode.node) |
| { |
| vNode.node = vNode.thunk(); |
| } |
| return render(vNode.node, eventNode); |
| |
| case 'tagger': |
| var subNode = vNode.node; |
| var tagger = vNode.tagger; |
| |
| while (subNode.type === 'tagger') |
| { |
| typeof tagger !== 'object' |
| ? tagger = [tagger, subNode.tagger] |
| : tagger.push(subNode.tagger); |
| |
| subNode = subNode.node; |
| } |
| |
| var subEventRoot = { |
| tagger: tagger, |
| parent: eventNode |
| }; |
| |
| var domNode = render(subNode, subEventRoot); |
| domNode.elm_event_node_ref = subEventRoot; |
| return domNode; |
| |
| case 'text': |
| return document.createTextNode(vNode.text); |
| |
| case 'node': |
| var domNode = vNode.namespace |
| ? document.createElementNS(vNode.namespace, vNode.tag) |
| : document.createElement(vNode.tag); |
| |
| applyFacts(domNode, eventNode, vNode.facts); |
| |
| var children = vNode.children; |
| |
| for (var i = 0; i < children.length; i++) |
| { |
| domNode.appendChild(render(children[i], eventNode)); |
| } |
| |
| return domNode; |
| |
| case 'keyed-node': |
| var domNode = vNode.namespace |
| ? document.createElementNS(vNode.namespace, vNode.tag) |
| : document.createElement(vNode.tag); |
| |
| applyFacts(domNode, eventNode, vNode.facts); |
| |
| var children = vNode.children; |
| |
| for (var i = 0; i < children.length; i++) |
| { |
| domNode.appendChild(render(children[i]._1, eventNode)); |
| } |
| |
| return domNode; |
| |
| case 'custom': |
| var domNode = vNode.impl.render(vNode.model); |
| applyFacts(domNode, eventNode, vNode.facts); |
| return domNode; |
| } |
| } |
| |
| |
| |
| //////////// APPLY FACTS //////////// |
| |
| |
| function applyFacts(domNode, eventNode, facts) |
| { |
| for (var key in facts) |
| { |
| var value = facts[key]; |
| |
| switch (key) |
| { |
| case STYLE_KEY: |
| applyStyles(domNode, value); |
| break; |
| |
| case EVENT_KEY: |
| applyEvents(domNode, eventNode, value); |
| break; |
| |
| case ATTR_KEY: |
| applyAttrs(domNode, value); |
| break; |
| |
| case ATTR_NS_KEY: |
| applyAttrsNS(domNode, value); |
| break; |
| |
| case 'value': |
| if (domNode[key] !== value) |
| { |
| domNode[key] = value; |
| } |
| break; |
| |
| default: |
| domNode[key] = value; |
| break; |
| } |
| } |
| } |
| |
| function applyStyles(domNode, styles) |
| { |
| var domNodeStyle = domNode.style; |
| |
| for (var key in styles) |
| { |
| domNodeStyle[key] = styles[key]; |
| } |
| } |
| |
| function applyEvents(domNode, eventNode, events) |
| { |
| var allHandlers = domNode.elm_handlers || {}; |
| |
| for (var key in events) |
| { |
| var handler = allHandlers[key]; |
| var value = events[key]; |
| |
| if (typeof value === 'undefined') |
| { |
| domNode.removeEventListener(key, handler); |
| allHandlers[key] = undefined; |
| } |
| else if (typeof handler === 'undefined') |
| { |
| var handler = makeEventHandler(eventNode, value); |
| domNode.addEventListener(key, handler); |
| allHandlers[key] = handler; |
| } |
| else |
| { |
| handler.info = value; |
| } |
| } |
| |
| domNode.elm_handlers = allHandlers; |
| } |
| |
| function makeEventHandler(eventNode, info) |
| { |
| function eventHandler(event) |
| { |
| var info = eventHandler.info; |
| |
| var value = A2(_elm_lang$core$Native_Json.run, info.decoder, event); |
| |
| if (value.ctor === 'Ok') |
| { |
| var options = info.options; |
| if (options.stopPropagation) |
| { |
| event.stopPropagation(); |
| } |
| if (options.preventDefault) |
| { |
| event.preventDefault(); |
| } |
| |
| var message = value._0; |
| |
| var currentEventNode = eventNode; |
| while (currentEventNode) |
| { |
| var tagger = currentEventNode.tagger; |
| if (typeof tagger === 'function') |
| { |
| message = tagger(message); |
| } |
| else |
| { |
| for (var i = tagger.length; i--; ) |
| { |
| message = tagger[i](message); |
| } |
| } |
| currentEventNode = currentEventNode.parent; |
| } |
| } |
| }; |
| |
| eventHandler.info = info; |
| |
| return eventHandler; |
| } |
| |
| function applyAttrs(domNode, attrs) |
| { |
| for (var key in attrs) |
| { |
| var value = attrs[key]; |
| if (typeof value === 'undefined') |
| { |
| domNode.removeAttribute(key); |
| } |
| else |
| { |
| domNode.setAttribute(key, value); |
| } |
| } |
| } |
| |
| function applyAttrsNS(domNode, nsAttrs) |
| { |
| for (var key in nsAttrs) |
| { |
| var pair = nsAttrs[key]; |
| var namespace = pair.namespace; |
| var value = pair.value; |
| |
| if (typeof value === 'undefined') |
| { |
| domNode.removeAttributeNS(namespace, key); |
| } |
| else |
| { |
| domNode.setAttributeNS(namespace, key, value); |
| } |
| } |
| } |
| |
| |
| |
| //////////// DIFF //////////// |
| |
| |
| function diff(a, b) |
| { |
| var patches = []; |
| diffHelp(a, b, patches, 0); |
| return patches; |
| } |
| |
| |
| function makePatch(type, index, data) |
| { |
| return { |
| index: index, |
| type: type, |
| data: data, |
| domNode: undefined, |
| eventNode: undefined |
| }; |
| } |
| |
| |
| function diffHelp(a, b, patches, index) |
| { |
| if (a === b) |
| { |
| return; |
| } |
| |
| var aType = a.type; |
| var bType = b.type; |
| |
| // Bail if you run into different types of nodes. Implies that the |
| // structure has changed significantly and it's not worth a diff. |
| if (aType !== bType) |
| { |
| patches.push(makePatch('p-redraw', index, b)); |
| return; |
| } |
| |
| // Now we know that both nodes are the same type. |
| switch (bType) |
| { |
| case 'thunk': |
| var aArgs = a.args; |
| var bArgs = b.args; |
| var i = aArgs.length; |
| var same = a.func === b.func && i === bArgs.length; |
| while (same && i--) |
| { |
| same = aArgs[i] === bArgs[i]; |
| } |
| if (same) |
| { |
| b.node = a.node; |
| return; |
| } |
| b.node = b.thunk(); |
| var subPatches = []; |
| diffHelp(a.node, b.node, subPatches, 0); |
| if (subPatches.length > 0) |
| { |
| patches.push(makePatch('p-thunk', index, subPatches)); |
| } |
| return; |
| |
| case 'tagger': |
| // gather nested taggers |
| var aTaggers = a.tagger; |
| var bTaggers = b.tagger; |
| var nesting = false; |
| |
| var aSubNode = a.node; |
| while (aSubNode.type === 'tagger') |
| { |
| nesting = true; |
| |
| typeof aTaggers !== 'object' |
| ? aTaggers = [aTaggers, aSubNode.tagger] |
| : aTaggers.push(aSubNode.tagger); |
| |
| aSubNode = aSubNode.node; |
| } |
| |
| var bSubNode = b.node; |
| while (bSubNode.type === 'tagger') |
| { |
| nesting = true; |
| |
| typeof bTaggers !== 'object' |
| ? bTaggers = [bTaggers, bSubNode.tagger] |
| : bTaggers.push(bSubNode.tagger); |
| |
| bSubNode = bSubNode.node; |
| } |
| |
| // Just bail if different numbers of taggers. This implies the |
| // structure of the virtual DOM has changed. |
| if (nesting && aTaggers.length !== bTaggers.length) |
| { |
| patches.push(makePatch('p-redraw', index, b)); |
| return; |
| } |
| |
| // check if taggers are "the same" |
| if (nesting ? !pairwiseRefEqual(aTaggers, bTaggers) : aTaggers !== bTaggers) |
| { |
| patches.push(makePatch('p-tagger', index, bTaggers)); |
| } |
| |
| // diff everything below the taggers |
| diffHelp(aSubNode, bSubNode, patches, index + 1); |
| return; |
| |
| case 'text': |
| if (a.text !== b.text) |
| { |
| patches.push(makePatch('p-text', index, b.text)); |
| return; |
| } |
| |
| return; |
| |
| case 'node': |
| // Bail if obvious indicators have changed. Implies more serious |
| // structural changes such that it's not worth it to diff. |
| if (a.tag !== b.tag || a.namespace !== b.namespace) |
| { |
| patches.push(makePatch('p-redraw', index, b)); |
| return; |
| } |
| |
| var factsDiff = diffFacts(a.facts, b.facts); |
| |
| if (typeof factsDiff !== 'undefined') |
| { |
| patches.push(makePatch('p-facts', index, factsDiff)); |
| } |
| |
| diffChildren(a, b, patches, index); |
| return; |
| |
| case 'keyed-node': |
| // Bail if obvious indicators have changed. Implies more serious |
| // structural changes such that it's not worth it to diff. |
| if (a.tag !== b.tag || a.namespace !== b.namespace) |
| { |
| patches.push(makePatch('p-redraw', index, b)); |
| return; |
| } |
| |
| var factsDiff = diffFacts(a.facts, b.facts); |
| |
| if (typeof factsDiff !== 'undefined') |
| { |
| patches.push(makePatch('p-facts', index, factsDiff)); |
| } |
| |
| diffKeyedChildren(a, b, patches, index); |
| return; |
| |
| case 'custom': |
| if (a.impl !== b.impl) |
| { |
| patches.push(makePatch('p-redraw', index, b)); |
| return; |
| } |
| |
| var factsDiff = diffFacts(a.facts, b.facts); |
| if (typeof factsDiff !== 'undefined') |
| { |
| patches.push(makePatch('p-facts', index, factsDiff)); |
| } |
| |
| var patch = b.impl.diff(a,b); |
| if (patch) |
| { |
| patches.push(makePatch('p-custom', index, patch)); |
| return; |
| } |
| |
| return; |
| } |
| } |
| |
| |
| // assumes the incoming arrays are the same length |
| function pairwiseRefEqual(as, bs) |
| { |
| for (var i = 0; i < as.length; i++) |
| { |
| if (as[i] !== bs[i]) |
| { |
| return false; |
| } |
| } |
| |
| return true; |
| } |
| |
| |
| // TODO Instead of creating a new diff object, it's possible to just test if |
| // there *is* a diff. During the actual patch, do the diff again and make the |
| // modifications directly. This way, there's no new allocations. Worth it? |
| function diffFacts(a, b, category) |
| { |
| var diff; |
| |
| // look for changes and removals |
| for (var aKey in a) |
| { |
| if (aKey === STYLE_KEY || aKey === EVENT_KEY || aKey === ATTR_KEY || aKey === ATTR_NS_KEY) |
| { |
| var subDiff = diffFacts(a[aKey], b[aKey] || {}, aKey); |
| if (subDiff) |
| { |
| diff = diff || {}; |
| diff[aKey] = subDiff; |
| } |
| continue; |
| } |
| |
| // remove if not in the new facts |
| if (!(aKey in b)) |
| { |
| diff = diff || {}; |
| diff[aKey] = |
| (typeof category === 'undefined') |
| ? (typeof a[aKey] === 'string' ? '' : null) |
| : |
| (category === STYLE_KEY) |
| ? '' |
| : |
| (category === EVENT_KEY || category === ATTR_KEY) |
| ? undefined |
| : |
| { namespace: a[aKey].namespace, value: undefined }; |
| |
| continue; |
| } |
| |
| var aValue = a[aKey]; |
| var bValue = b[aKey]; |
| |
| // reference equal, so don't worry about it |
| if (aValue === bValue && aKey !== 'value' |
| || category === EVENT_KEY && equalEvents(aValue, bValue)) |
| { |
| continue; |
| } |
| |
| diff = diff || {}; |
| diff[aKey] = bValue; |
| } |
| |
| // add new stuff |
| for (var bKey in b) |
| { |
| if (!(bKey in a)) |
| { |
| diff = diff || {}; |
| diff[bKey] = b[bKey]; |
| } |
| } |
| |
| return diff; |
| } |
| |
| |
| function diffChildren(aParent, bParent, patches, rootIndex) |
| { |
| var aChildren = aParent.children; |
| var bChildren = bParent.children; |
| |
| var aLen = aChildren.length; |
| var bLen = bChildren.length; |
| |
| // FIGURE OUT IF THERE ARE INSERTS OR REMOVALS |
| |
| if (aLen > bLen) |
| { |
| patches.push(makePatch('p-remove-last', rootIndex, aLen - bLen)); |
| } |
| else if (aLen < bLen) |
| { |
| patches.push(makePatch('p-append', rootIndex, bChildren.slice(aLen))); |
| } |
| |
| // PAIRWISE DIFF EVERYTHING ELSE |
| |
| var index = rootIndex; |
| var minLen = aLen < bLen ? aLen : bLen; |
| for (var i = 0; i < minLen; i++) |
| { |
| index++; |
| var aChild = aChildren[i]; |
| diffHelp(aChild, bChildren[i], patches, index); |
| index += aChild.descendantsCount || 0; |
| } |
| } |
| |
| |
| |
| //////////// KEYED DIFF //////////// |
| |
| |
| function diffKeyedChildren(aParent, bParent, patches, rootIndex) |
| { |
| var localPatches = []; |
| |
| var changes = {}; // Dict String Entry |
| var inserts = []; // Array { index : Int, entry : Entry } |
| // type Entry = { tag : String, vnode : VNode, index : Int, data : _ } |
| |
| var aChildren = aParent.children; |
| var bChildren = bParent.children; |
| var aLen = aChildren.length; |
| var bLen = bChildren.length; |
| var aIndex = 0; |
| var bIndex = 0; |
| |
| var index = rootIndex; |
| |
| while (aIndex < aLen && bIndex < bLen) |
| { |
| var a = aChildren[aIndex]; |
| var b = bChildren[bIndex]; |
| |
| var aKey = a._0; |
| var bKey = b._0; |
| var aNode = a._1; |
| var bNode = b._1; |
| |
| // check if keys match |
| |
| if (aKey === bKey) |
| { |
| index++; |
| diffHelp(aNode, bNode, localPatches, index); |
| index += aNode.descendantsCount || 0; |
| |
| aIndex++; |
| bIndex++; |
| continue; |
| } |
| |
| // look ahead 1 to detect insertions and removals. |
| |
| var aLookAhead = aIndex + 1 < aLen; |
| var bLookAhead = bIndex + 1 < bLen; |
| |
| if (aLookAhead) |
| { |
| var aNext = aChildren[aIndex + 1]; |
| var aNextKey = aNext._0; |
| var aNextNode = aNext._1; |
| var oldMatch = bKey === aNextKey; |
| } |
| |
| if (bLookAhead) |
| { |
| var bNext = bChildren[bIndex + 1]; |
| var bNextKey = bNext._0; |
| var bNextNode = bNext._1; |
| var newMatch = aKey === bNextKey; |
| } |
| |
| |
| // swap a and b |
| if (aLookAhead && bLookAhead && newMatch && oldMatch) |
| { |
| index++; |
| diffHelp(aNode, bNextNode, localPatches, index); |
| insertNode(changes, localPatches, aKey, bNode, bIndex, inserts); |
| index += aNode.descendantsCount || 0; |
| |
| index++; |
| removeNode(changes, localPatches, aKey, aNextNode, index); |
| index += aNextNode.descendantsCount || 0; |
| |
| aIndex += 2; |
| bIndex += 2; |
| continue; |
| } |
| |
| // insert b |
| if (bLookAhead && newMatch) |
| { |
| index++; |
| insertNode(changes, localPatches, bKey, bNode, bIndex, inserts); |
| diffHelp(aNode, bNextNode, localPatches, index); |
| index += aNode.descendantsCount || 0; |
| |
| aIndex += 1; |
| bIndex += 2; |
| continue; |
| } |
| |
| // remove a |
| if (aLookAhead && oldMatch) |
| { |
| index++; |
| removeNode(changes, localPatches, aKey, aNode, index); |
| index += aNode.descendantsCount || 0; |
| |
| index++; |
| diffHelp(aNextNode, bNode, localPatches, index); |
| index += aNextNode.descendantsCount || 0; |
| |
| aIndex += 2; |
| bIndex += 1; |
| continue; |
| } |
| |
| // remove a, insert b |
| if (aLookAhead && bLookAhead && aNextKey === bNextKey) |
| { |
| index++; |
| removeNode(changes, localPatches, aKey, aNode, index); |
| insertNode(changes, localPatches, bKey, bNode, bIndex, inserts); |
| index += aNode.descendantsCount || 0; |
| |
| index++; |
| diffHelp(aNextNode, bNextNode, localPatches, index); |
| index += aNextNode.descendantsCount || 0; |
| |
| aIndex += 2; |
| bIndex += 2; |
| continue; |
| } |
| |
| break; |
| } |
| |
| // eat up any remaining nodes with removeNode and insertNode |
| |
| while (aIndex < aLen) |
| { |
| index++; |
| var a = aChildren[aIndex]; |
| var aNode = a._1; |
| removeNode(changes, localPatches, a._0, aNode, index); |
| index += aNode.descendantsCount || 0; |
| aIndex++; |
| } |
| |
| var endInserts; |
| while (bIndex < bLen) |
| { |
| endInserts = endInserts || []; |
| var b = bChildren[bIndex]; |
| insertNode(changes, localPatches, b._0, b._1, undefined, endInserts); |
| bIndex++; |
| } |
| |
| if (localPatches.length > 0 || inserts.length > 0 || typeof endInserts !== 'undefined') |
| { |
| patches.push(makePatch('p-reorder', rootIndex, { |
| patches: localPatches, |
| inserts: inserts, |
| endInserts: endInserts |
| })); |
| } |
| } |
| |
| |
| |
| //////////// CHANGES FROM KEYED DIFF //////////// |
| |
| |
| var POSTFIX = '_elmW6BL'; |
| |
| |
| function insertNode(changes, localPatches, key, vnode, bIndex, inserts) |
| { |
| var entry = changes[key]; |
| |
| // never seen this key before |
| if (typeof entry === 'undefined') |
| { |
| entry = { |
| tag: 'insert', |
| vnode: vnode, |
| index: bIndex, |
| data: undefined |
| }; |
| |
| inserts.push({ index: bIndex, entry: entry }); |
| changes[key] = entry; |
| |
| return; |
| } |
| |
| // this key was removed earlier, a match! |
| if (entry.tag === 'remove') |
| { |
| inserts.push({ index: bIndex, entry: entry }); |
| |
| entry.tag = 'move'; |
| var subPatches = []; |
| diffHelp(entry.vnode, vnode, subPatches, entry.index); |
| entry.index = bIndex; |
| entry.data.data = { |
| patches: subPatches, |
| entry: entry |
| }; |
| |
| return; |
| } |
| |
| // this key has already been inserted or moved, a duplicate! |
| insertNode(changes, localPatches, key + POSTFIX, vnode, bIndex, inserts); |
| } |
| |
| |
| function removeNode(changes, localPatches, key, vnode, index) |
| { |
| var entry = changes[key]; |
| |
| // never seen this key before |
| if (typeof entry === 'undefined') |
| { |
| var patch = makePatch('p-remove', index, undefined); |
| localPatches.push(patch); |
| |
| changes[key] = { |
| tag: 'remove', |
| vnode: vnode, |
| index: index, |
| data: patch |
| }; |
| |
| return; |
| } |
| |
| // this key was inserted earlier, a match! |
| if (entry.tag === 'insert') |
| { |
| entry.tag = 'move'; |
| var subPatches = []; |
| diffHelp(vnode, entry.vnode, subPatches, index); |
| |
| var patch = makePatch('p-remove', index, { |
| patches: subPatches, |
| entry: entry |
| }); |
| localPatches.push(patch); |
| |
| return; |
| } |
| |
| // this key has already been removed or moved, a duplicate! |
| removeNode(changes, localPatches, key + POSTFIX, vnode, index); |
| } |
| |
| |
| |
| //////////// ADD DOM NODES //////////// |
| // |
| // Each DOM node has an "index" assigned in order of traversal. It is important |
| // to minimize our crawl over the actual DOM, so these indexes (along with the |
| // descendantsCount of virtual nodes) let us skip touching entire subtrees of |
| // the DOM if we know there are no patches there. |
| |
| |
| function addDomNodes(domNode, vNode, patches, eventNode) |
| { |
| addDomNodesHelp(domNode, vNode, patches, 0, 0, vNode.descendantsCount, eventNode); |
| } |
| |
| |
| // assumes `patches` is non-empty and indexes increase monotonically. |
| function addDomNodesHelp(domNode, vNode, patches, i, low, high, eventNode) |
| { |
| var patch = patches[i]; |
| var index = patch.index; |
| |
| while (index === low) |
| { |
| var patchType = patch.type; |
| |
| if (patchType === 'p-thunk') |
| { |
| addDomNodes(domNode, vNode.node, patch.data, eventNode); |
| } |
| else if (patchType === 'p-reorder') |
| { |
| patch.domNode = domNode; |
| patch.eventNode = eventNode; |
| |
| var subPatches = patch.data.patches; |
| if (subPatches.length > 0) |
| { |
| addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); |
| } |
| } |
| else if (patchType === 'p-remove') |
| { |
| patch.domNode = domNode; |
| patch.eventNode = eventNode; |
| |
| var data = patch.data; |
| if (typeof data !== 'undefined') |
| { |
| data.entry.data = domNode; |
| var subPatches = data.patches; |
| if (subPatches.length > 0) |
| { |
| addDomNodesHelp(domNode, vNode, subPatches, 0, low, high, eventNode); |
| } |
| } |
| } |
| else |
| { |
| patch.domNode = domNode; |
| patch.eventNode = eventNode; |
| } |
| |
| i++; |
| |
| if (!(patch = patches[i]) || (index = patch.index) > high) |
| { |
| return i; |
| } |
| } |
| |
| switch (vNode.type) |
| { |
| case 'tagger': |
| var subNode = vNode.node; |
| |
| while (subNode.type === "tagger") |
| { |
| subNode = subNode.node; |
| } |
| |
| return addDomNodesHelp(domNode, subNode, patches, i, low + 1, high, domNode.elm_event_node_ref); |
| |
| case 'node': |
| var vChildren = vNode.children; |
| var childNodes = domNode.childNodes; |
| for (var j = 0; j < vChildren.length; j++) |
| { |
| low++; |
| var vChild = vChildren[j]; |
| var nextLow = low + (vChild.descendantsCount || 0); |
| if (low <= index && index <= nextLow) |
| { |
| i = addDomNodesHelp(childNodes[j], vChild, patches, i, low, nextLow, eventNode); |
| if (!(patch = patches[i]) || (index = patch.index) > high) |
| { |
| return i; |
| } |
| } |
| low = nextLow; |
| } |
| return i; |
| |
| case 'keyed-node': |
| var vChildren = vNode.children; |
| var childNodes = domNode.childNodes; |
| for (var j = 0; j < vChildren.length; j++) |
| { |
| low++; |
| var vChild = vChildren[j]._1; |
| var nextLow = low + (vChild.descendantsCount || 0); |
| if (low <= index && index <= nextLow) |
| { |
| i = addDomNodesHelp(childNodes[j], vChild, patches, i, low, nextLow, eventNode); |
| if (!(patch = patches[i]) || (index = patch.index) > high) |
| { |
| return i; |
| } |
| } |
| low = nextLow; |
| } |
| return i; |
| |
| case 'text': |
| case 'thunk': |
| throw new Error('should never traverse `text` or `thunk` nodes like this'); |
| } |
| } |
| |
| |
| |
| //////////// APPLY PATCHES //////////// |
| |
| |
| function applyPatches(rootDomNode, oldVirtualNode, patches, eventNode) |
| { |
| if (patches.length === 0) |
| { |
| return rootDomNode; |
| } |
| |
| addDomNodes(rootDomNode, oldVirtualNode, patches, eventNode); |
| return applyPatchesHelp(rootDomNode, patches); |
| } |
| |
| function applyPatchesHelp(rootDomNode, patches) |
| { |
| for (var i = 0; i < patches.length; i++) |
| { |
| var patch = patches[i]; |
| var localDomNode = patch.domNode |
| var newNode = applyPatch(localDomNode, patch); |
| if (localDomNode === rootDomNode) |
| { |
| rootDomNode = newNode; |
| } |
| } |
| return rootDomNode; |
| } |
| |
| function applyPatch(domNode, patch) |
| { |
| switch (patch.type) |
| { |
| case 'p-redraw': |
| return applyPatchRedraw(domNode, patch.data, patch.eventNode); |
| |
| case 'p-facts': |
| applyFacts(domNode, patch.eventNode, patch.data); |
| return domNode; |
| |
| case 'p-text': |
| domNode.replaceData(0, domNode.length, patch.data); |
| return domNode; |
| |
| case 'p-thunk': |
| return applyPatchesHelp(domNode, patch.data); |
| |
| case 'p-tagger': |
| domNode.elm_event_node_ref.tagger = patch.data; |
| return domNode; |
| |
| case 'p-remove-last': |
| var i = patch.data; |
| while (i--) |
| { |
| domNode.removeChild(domNode.lastChild); |
| } |
| return domNode; |
| |
| case 'p-append': |
| var newNodes = patch.data; |
| for (var i = 0; i < newNodes.length; i++) |
| { |
| domNode.appendChild(render(newNodes[i], patch.eventNode)); |
| } |
| return domNode; |
| |
| case 'p-remove': |
| var data = patch.data; |
| if (typeof data === 'undefined') |
| { |
| domNode.parentNode.removeChild(domNode); |
| return domNode; |
| } |
| var entry = data.entry; |
| if (typeof entry.index !== 'undefined') |
| { |
| domNode.parentNode.removeChild(domNode); |
| } |
| entry.data = applyPatchesHelp(domNode, data.patches); |
| return domNode; |
| |
| case 'p-reorder': |
| return applyPatchReorder(domNode, patch); |
| |
| case 'p-custom': |
| var impl = patch.data; |
| return impl.applyPatch(domNode, impl.data); |
| |
| default: |
| throw new Error('Ran into an unknown patch!'); |
| } |
| } |
| |
| |
| function applyPatchRedraw(domNode, vNode, eventNode) |
| { |
| var parentNode = domNode.parentNode; |
| var newNode = render(vNode, eventNode); |
| |
| if (typeof newNode.elm_event_node_ref === 'undefined') |
| { |
| newNode.elm_event_node_ref = domNode.elm_event_node_ref; |
| } |
| |
| if (parentNode && newNode !== domNode) |
| { |
| parentNode.replaceChild(newNode, domNode); |
| } |
| return newNode; |
| } |
| |
| |
| function applyPatchReorder(domNode, patch) |
| { |
| var data = patch.data; |
| |
| // remove end inserts |
| var frag = applyPatchReorderEndInsertsHelp(data.endInserts, patch); |
| |
| // removals |
| domNode = applyPatchesHelp(domNode, data.patches); |
| |
| // inserts |
| var inserts = data.inserts; |
| for (var i = 0; i < inserts.length; i++) |
| { |
| var insert = inserts[i]; |
| var entry = insert.entry; |
| var node = entry.tag === 'move' |
| ? entry.data |
| : render(entry.vnode, patch.eventNode); |
| domNode.insertBefore(node, domNode.childNodes[insert.index]); |
| } |
| |
| // add end inserts |
| if (typeof frag !== 'undefined') |
| { |
| domNode.appendChild(frag); |
| } |
| |
| return domNode; |
| } |
| |
| |
| function applyPatchReorderEndInsertsHelp(endInserts, patch) |
| { |
| if (typeof endInserts === 'undefined') |
| { |
| return; |
| } |
| |
| var frag = document.createDocumentFragment(); |
| for (var i = 0; i < endInserts.length; i++) |
| { |
| var insert = endInserts[i]; |
| var entry = insert.entry; |
| frag.appendChild(entry.tag === 'move' |
| ? entry.data |
| : render(entry.vnode, patch.eventNode) |
| ); |
| } |
| return frag; |
| } |
| |
| |
| |
| //////////// PROGRAMS //////////// |
| |
| |
| function programWithFlags(details) |
| { |
| return { |
| init: details.init, |
| update: details.update, |
| subscriptions: details.subscriptions, |
| view: details.view, |
| renderer: renderer |
| }; |
| } |
| |
| |
| return { |
| node: node, |
| text: text, |
| |
| custom: custom, |
| |
| map: F2(map), |
| |
| on: F3(on), |
| style: style, |
| property: F2(property), |
| attribute: F2(attribute), |
| attributeNS: F3(attributeNS), |
| |
| lazy: F2(lazy), |
| lazy2: F3(lazy2), |
| lazy3: F4(lazy3), |
| keyedNode: F3(keyedNode), |
| |
| programWithFlags: programWithFlags |
| }; |
| |
| }(); |
| var _elm_lang$virtual_dom$VirtualDom$programWithFlags = _elm_lang$virtual_dom$Native_VirtualDom.programWithFlags; |
| var _elm_lang$virtual_dom$VirtualDom$keyedNode = _elm_lang$virtual_dom$Native_VirtualDom.keyedNode; |
| var _elm_lang$virtual_dom$VirtualDom$lazy3 = _elm_lang$virtual_dom$Native_VirtualDom.lazy3; |
| var _elm_lang$virtual_dom$VirtualDom$lazy2 = _elm_lang$virtual_dom$Native_VirtualDom.lazy2; |
| var _elm_lang$virtual_dom$VirtualDom$lazy = _elm_lang$virtual_dom$Native_VirtualDom.lazy; |
| var _elm_lang$virtual_dom$VirtualDom$defaultOptions = {stopPropagation: false, preventDefault: false}; |
| var _elm_lang$virtual_dom$VirtualDom$onWithOptions = _elm_lang$virtual_dom$Native_VirtualDom.on; |
| var _elm_lang$virtual_dom$VirtualDom$on = F2( |
| function (eventName, decoder) { |
| return A3(_elm_lang$virtual_dom$VirtualDom$onWithOptions, eventName, _elm_lang$virtual_dom$VirtualDom$defaultOptions, decoder); |
| }); |
| var _elm_lang$virtual_dom$VirtualDom$style = _elm_lang$virtual_dom$Native_VirtualDom.style; |
| var _elm_lang$virtual_dom$VirtualDom$attributeNS = _elm_lang$virtual_dom$Native_VirtualDom.attributeNS; |
| var _elm_lang$virtual_dom$VirtualDom$attribute = _elm_lang$virtual_dom$Native_VirtualDom.attribute; |
| var _elm_lang$virtual_dom$VirtualDom$property = _elm_lang$virtual_dom$Native_VirtualDom.property; |
| var _elm_lang$virtual_dom$VirtualDom$map = _elm_lang$virtual_dom$Native_VirtualDom.map; |
| var _elm_lang$virtual_dom$VirtualDom$text = _elm_lang$virtual_dom$Native_VirtualDom.text; |
| var _elm_lang$virtual_dom$VirtualDom$node = _elm_lang$virtual_dom$Native_VirtualDom.node; |
| var _elm_lang$virtual_dom$VirtualDom$Options = F2( |
| function (a, b) { |
| return {stopPropagation: a, preventDefault: b}; |
| }); |
| var _elm_lang$virtual_dom$VirtualDom$Node = {ctor: 'Node'}; |
| var _elm_lang$virtual_dom$VirtualDom$Property = {ctor: 'Property'}; |
| |
| var _elm_lang$html$Html$text = _elm_lang$virtual_dom$VirtualDom$text; |
| var _elm_lang$html$Html$node = _elm_lang$virtual_dom$VirtualDom$node; |
| var _elm_lang$html$Html$body = _elm_lang$html$Html$node('body'); |
| var _elm_lang$html$Html$section = _elm_lang$html$Html$node('section'); |
| var _elm_lang$html$Html$nav = _elm_lang$html$Html$node('nav'); |
| var _elm_lang$html$Html$article = _elm_lang$html$Html$node('article'); |
| var _elm_lang$html$Html$aside = _elm_lang$html$Html$node('aside'); |
| var _elm_lang$html$Html$h1 = _elm_lang$html$Html$node('h1'); |
| var _elm_lang$html$Html$h2 = _elm_lang$html$Html$node('h2'); |
| var _elm_lang$html$Html$h3 = _elm_lang$html$Html$node('h3'); |
| var _elm_lang$html$Html$h4 = _elm_lang$html$Html$node('h4'); |
| var _elm_lang$html$Html$h5 = _elm_lang$html$Html$node('h5'); |
| var _elm_lang$html$Html$h6 = _elm_lang$html$Html$node('h6'); |
| var _elm_lang$html$Html$header = _elm_lang$html$Html$node('header'); |
| var _elm_lang$html$Html$footer = _elm_lang$html$Html$node('footer'); |
| var _elm_lang$html$Html$address = _elm_lang$html$Html$node('address'); |
| var _elm_lang$html$Html$main$ = _elm_lang$html$Html$node('main'); |
| var _elm_lang$html$Html$p = _elm_lang$html$Html$node('p'); |
| var _elm_lang$html$Html$hr = _elm_lang$html$Html$node('hr'); |
| var _elm_lang$html$Html$pre = _elm_lang$html$Html$node('pre'); |
| var _elm_lang$html$Html$blockquote = _elm_lang$html$Html$node('blockquote'); |
| var _elm_lang$html$Html$ol = _elm_lang$html$Html$node('ol'); |
| var _elm_lang$html$Html$ul = _elm_lang$html$Html$node('ul'); |
| var _elm_lang$html$Html$li = _elm_lang$html$Html$node('li'); |
| var _elm_lang$html$Html$dl = _elm_lang$html$Html$node('dl'); |
| var _elm_lang$html$Html$dt = _elm_lang$html$Html$node('dt'); |
| var _elm_lang$html$Html$dd = _elm_lang$html$Html$node('dd'); |
| var _elm_lang$html$Html$figure = _elm_lang$html$Html$node('figure'); |
| var _elm_lang$html$Html$figcaption = _elm_lang$html$Html$node('figcaption'); |
| var _elm_lang$html$Html$div = _elm_lang$html$Html$node('div'); |
| var _elm_lang$html$Html$a = _elm_lang$html$Html$node('a'); |
| var _elm_lang$html$Html$em = _elm_lang$html$Html$node('em'); |
| var _elm_lang$html$Html$strong = _elm_lang$html$Html$node('strong'); |
| var _elm_lang$html$Html$small = _elm_lang$html$Html$node('small'); |
| var _elm_lang$html$Html$s = _elm_lang$html$Html$node('s'); |
| var _elm_lang$html$Html$cite = _elm_lang$html$Html$node('cite'); |
| var _elm_lang$html$Html$q = _elm_lang$html$Html$node('q'); |
| var _elm_lang$html$Html$dfn = _elm_lang$html$Html$node('dfn'); |
| var _elm_lang$html$Html$abbr = _elm_lang$html$Html$node('abbr'); |
| var _elm_lang$html$Html$time = _elm_lang$html$Html$node('time'); |
| var _elm_lang$html$Html$code = _elm_lang$html$Html$node('code'); |
| var _elm_lang$html$Html$var = _elm_lang$html$Html$node('var'); |
| var _elm_lang$html$Html$samp = _elm_lang$html$Html$node('samp'); |
| var _elm_lang$html$Html$kbd = _elm_lang$html$Html$node('kbd'); |
| var _elm_lang$html$Html$sub = _elm_lang$html$Html$node('sub'); |
| var _elm_lang$html$Html$sup = _elm_lang$html$Html$node('sup'); |
| var _elm_lang$html$Html$i = _elm_lang$html$Html$node('i'); |
| var _elm_lang$html$Html$b = _elm_lang$html$Html$node('b'); |
| var _elm_lang$html$Html$u = _elm_lang$html$Html$node('u'); |
| var _elm_lang$html$Html$mark = _elm_lang$html$Html$node('mark'); |
| var _elm_lang$html$Html$ruby = _elm_lang$html$Html$node('ruby'); |
| var _elm_lang$html$Html$rt = _elm_lang$html$Html$node('rt'); |
| var _elm_lang$html$Html$rp = _elm_lang$html$Html$node('rp'); |
| var _elm_lang$html$Html$bdi = _elm_lang$html$Html$node('bdi'); |
| var _elm_lang$html$Html$bdo = _elm_lang$html$Html$node('bdo'); |
| var _elm_lang$html$Html$span = _elm_lang$html$Html$node('span'); |
| var _elm_lang$html$Html$br = _elm_lang$html$Html$node('br'); |
| var _elm_lang$html$Html$wbr = _elm_lang$html$Html$node('wbr'); |
| var _elm_lang$html$Html$ins = _elm_lang$html$Html$node('ins'); |
| var _elm_lang$html$Html$del = _elm_lang$html$Html$node('del'); |
| var _elm_lang$html$Html$img = _elm_lang$html$Html$node('img'); |
| var _elm_lang$html$Html$iframe = _elm_lang$html$Html$node('iframe'); |
| var _elm_lang$html$Html$embed = _elm_lang$html$Html$node('embed'); |
| var _elm_lang$html$Html$object = _elm_lang$html$Html$node('object'); |
| var _elm_lang$html$Html$param = _elm_lang$html$Html$node('param'); |
| var _elm_lang$html$Html$video = _elm_lang$html$Html$node('video'); |
| var _elm_lang$html$Html$audio = _elm_lang$html$Html$node('audio'); |
| var _elm_lang$html$Html$source = _elm_lang$html$Html$node('source'); |
| var _elm_lang$html$Html$track = _elm_lang$html$Html$node('track'); |
| var _elm_lang$html$Html$canvas = _elm_lang$html$Html$node('canvas'); |
| var _elm_lang$html$Html$svg = _elm_lang$html$Html$node('svg'); |
| var _elm_lang$html$Html$math = _elm_lang$html$Html$node('math'); |
| var _elm_lang$html$Html$table = _elm_lang$html$Html$node('table'); |
| var _elm_lang$html$Html$caption = _elm_lang$html$Html$node('caption'); |
| var _elm_lang$html$Html$colgroup = _elm_lang$html$Html$node('colgroup'); |
| var _elm_lang$html$Html$col = _elm_lang$html$Html$node('col'); |
| var _elm_lang$html$Html$tbody = _elm_lang$html$Html$node('tbody'); |
| var _elm_lang$html$Html$thead = _elm_lang$html$Html$node('thead'); |
| var _elm_lang$html$Html$tfoot = _elm_lang$html$Html$node('tfoot'); |
| var _elm_lang$html$Html$tr = _elm_lang$html$Html$node('tr'); |
| var _elm_lang$html$Html$td = _elm_lang$html$Html$node('td'); |
| var _elm_lang$html$Html$th = _elm_lang$html$Html$node('th'); |
| var _elm_lang$html$Html$form = _elm_lang$html$Html$node('form'); |
| var _elm_lang$html$Html$fieldset = _elm_lang$html$Html$node('fieldset'); |
| var _elm_lang$html$Html$legend = _elm_lang$html$Html$node('legend'); |
| var _elm_lang$html$Html$label = _elm_lang$html$Html$node('label'); |
| var _elm_lang$html$Html$input = _elm_lang$html$Html$node('input'); |
| var _elm_lang$html$Html$button = _elm_lang$html$Html$node('button'); |
| var _elm_lang$html$Html$select = _elm_lang$html$Html$node('select'); |
| var _elm_lang$html$Html$datalist = _elm_lang$html$Html$node('datalist'); |
| var _elm_lang$html$Html$optgroup = _elm_lang$html$Html$node('optgroup'); |
| var _elm_lang$html$Html$option = _elm_lang$html$Html$node('option'); |
| var _elm_lang$html$Html$textarea = _elm_lang$html$Html$node('textarea'); |
| var _elm_lang$html$Html$keygen = _elm_lang$html$Html$node('keygen'); |
| var _elm_lang$html$Html$output = _elm_lang$html$Html$node('output'); |
| var _elm_lang$html$Html$progress = _elm_lang$html$Html$node('progress'); |
| var _elm_lang$html$Html$meter = _elm_lang$html$Html$node('meter'); |
| var _elm_lang$html$Html$details = _elm_lang$html$Html$node('details'); |
| var _elm_lang$html$Html$summary = _elm_lang$html$Html$node('summary'); |
| var _elm_lang$html$Html$menuitem = _elm_lang$html$Html$node('menuitem'); |
| var _elm_lang$html$Html$menu = _elm_lang$html$Html$node('menu'); |
| |
| var _elm_lang$html$Html_App$programWithFlags = _elm_lang$virtual_dom$VirtualDom$programWithFlags; |
| var _elm_lang$html$Html_App$program = function (app) { |
| return _elm_lang$html$Html_App$programWithFlags( |
| _elm_lang$core$Native_Utils.update( |
| app, |
| { |
| init: function (_p0) { |
| return app.init; |
| } |
| })); |
| }; |
| var _elm_lang$html$Html_App$beginnerProgram = function (_p1) { |
| var _p2 = _p1; |
| return _elm_lang$html$Html_App$programWithFlags( |
| { |
| init: function (_p3) { |
| return A2( |
| _elm_lang$core$Platform_Cmd_ops['!'], |
| _p2.model, |
| _elm_lang$core$Native_List.fromArray( |
| [])); |
| }, |
| update: F2( |
| function (msg, model) { |
| return A2( |
| _elm_lang$core$Platform_Cmd_ops['!'], |
| A2(_p2.update, msg, model), |
| _elm_lang$core$Native_List.fromArray( |
| [])); |
| }), |
| view: _p2.view, |
| subscriptions: function (_p4) { |
| return _elm_lang$core$Platform_Sub$none; |
| } |
| }); |
| }; |
| var _elm_lang$html$Html_App$map = _elm_lang$virtual_dom$VirtualDom$map; |
| |
| var _elm_lang$html$Html_Attributes$attribute = _elm_lang$virtual_dom$VirtualDom$attribute; |
| var _elm_lang$html$Html_Attributes$contextmenu = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$attribute, 'contextmenu', value); |
| }; |
| var _elm_lang$html$Html_Attributes$draggable = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$attribute, 'draggable', value); |
| }; |
| var _elm_lang$html$Html_Attributes$list = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$attribute, 'list', value); |
| }; |
| var _elm_lang$html$Html_Attributes$maxlength = function (n) { |
| return A2( |
| _elm_lang$html$Html_Attributes$attribute, |
| 'maxlength', |
| _elm_lang$core$Basics$toString(n)); |
| }; |
| var _elm_lang$html$Html_Attributes$datetime = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$attribute, 'datetime', value); |
| }; |
| var _elm_lang$html$Html_Attributes$pubdate = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$attribute, 'pubdate', value); |
| }; |
| var _elm_lang$html$Html_Attributes$colspan = function (n) { |
| return A2( |
| _elm_lang$html$Html_Attributes$attribute, |
| 'colspan', |
| _elm_lang$core$Basics$toString(n)); |
| }; |
| var _elm_lang$html$Html_Attributes$rowspan = function (n) { |
| return A2( |
| _elm_lang$html$Html_Attributes$attribute, |
| 'rowspan', |
| _elm_lang$core$Basics$toString(n)); |
| }; |
| var _elm_lang$html$Html_Attributes$property = _elm_lang$virtual_dom$VirtualDom$property; |
| var _elm_lang$html$Html_Attributes$stringProperty = F2( |
| function (name, string) { |
| return A2( |
| _elm_lang$html$Html_Attributes$property, |
| name, |
| _elm_lang$core$Json_Encode$string(string)); |
| }); |
| var _elm_lang$html$Html_Attributes$class = function (name) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'className', name); |
| }; |
| var _elm_lang$html$Html_Attributes$id = function (name) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'id', name); |
| }; |
| var _elm_lang$html$Html_Attributes$title = function (name) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'title', name); |
| }; |
| var _elm_lang$html$Html_Attributes$accesskey = function ($char) { |
| return A2( |
| _elm_lang$html$Html_Attributes$stringProperty, |
| 'accessKey', |
| _elm_lang$core$String$fromChar($char)); |
| }; |
| var _elm_lang$html$Html_Attributes$dir = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'dir', value); |
| }; |
| var _elm_lang$html$Html_Attributes$dropzone = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'dropzone', value); |
| }; |
| var _elm_lang$html$Html_Attributes$itemprop = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'itemprop', value); |
| }; |
| var _elm_lang$html$Html_Attributes$lang = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'lang', value); |
| }; |
| var _elm_lang$html$Html_Attributes$tabindex = function (n) { |
| return A2( |
| _elm_lang$html$Html_Attributes$stringProperty, |
| 'tabIndex', |
| _elm_lang$core$Basics$toString(n)); |
| }; |
| var _elm_lang$html$Html_Attributes$charset = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'charset', value); |
| }; |
| var _elm_lang$html$Html_Attributes$content = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'content', value); |
| }; |
| var _elm_lang$html$Html_Attributes$httpEquiv = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'httpEquiv', value); |
| }; |
| var _elm_lang$html$Html_Attributes$language = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'language', value); |
| }; |
| var _elm_lang$html$Html_Attributes$src = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'src', value); |
| }; |
| var _elm_lang$html$Html_Attributes$height = function (value) { |
| return A2( |
| _elm_lang$html$Html_Attributes$stringProperty, |
| 'height', |
| _elm_lang$core$Basics$toString(value)); |
| }; |
| var _elm_lang$html$Html_Attributes$width = function (value) { |
| return A2( |
| _elm_lang$html$Html_Attributes$stringProperty, |
| 'width', |
| _elm_lang$core$Basics$toString(value)); |
| }; |
| var _elm_lang$html$Html_Attributes$alt = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'alt', value); |
| }; |
| var _elm_lang$html$Html_Attributes$preload = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'preload', value); |
| }; |
| var _elm_lang$html$Html_Attributes$poster = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'poster', value); |
| }; |
| var _elm_lang$html$Html_Attributes$kind = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'kind', value); |
| }; |
| var _elm_lang$html$Html_Attributes$srclang = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'srclang', value); |
| }; |
| var _elm_lang$html$Html_Attributes$sandbox = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'sandbox', value); |
| }; |
| var _elm_lang$html$Html_Attributes$srcdoc = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'srcdoc', value); |
| }; |
| var _elm_lang$html$Html_Attributes$type$ = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'type', value); |
| }; |
| var _elm_lang$html$Html_Attributes$value = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'value', value); |
| }; |
| var _elm_lang$html$Html_Attributes$defaultValue = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'defaultValue', value); |
| }; |
| var _elm_lang$html$Html_Attributes$placeholder = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'placeholder', value); |
| }; |
| var _elm_lang$html$Html_Attributes$accept = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'accept', value); |
| }; |
| var _elm_lang$html$Html_Attributes$acceptCharset = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'acceptCharset', value); |
| }; |
| var _elm_lang$html$Html_Attributes$action = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'action', value); |
| }; |
| var _elm_lang$html$Html_Attributes$autocomplete = function (bool) { |
| return A2( |
| _elm_lang$html$Html_Attributes$stringProperty, |
| 'autocomplete', |
| bool ? 'on' : 'off'); |
| }; |
| var _elm_lang$html$Html_Attributes$autosave = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'autosave', value); |
| }; |
| var _elm_lang$html$Html_Attributes$enctype = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'enctype', value); |
| }; |
| var _elm_lang$html$Html_Attributes$formaction = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'formAction', value); |
| }; |
| var _elm_lang$html$Html_Attributes$minlength = function (n) { |
| return A2( |
| _elm_lang$html$Html_Attributes$stringProperty, |
| 'minLength', |
| _elm_lang$core$Basics$toString(n)); |
| }; |
| var _elm_lang$html$Html_Attributes$method = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'method', value); |
| }; |
| var _elm_lang$html$Html_Attributes$name = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'name', value); |
| }; |
| var _elm_lang$html$Html_Attributes$pattern = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'pattern', value); |
| }; |
| var _elm_lang$html$Html_Attributes$size = function (n) { |
| return A2( |
| _elm_lang$html$Html_Attributes$stringProperty, |
| 'size', |
| _elm_lang$core$Basics$toString(n)); |
| }; |
| var _elm_lang$html$Html_Attributes$for = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'htmlFor', value); |
| }; |
| var _elm_lang$html$Html_Attributes$form = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'form', value); |
| }; |
| var _elm_lang$html$Html_Attributes$max = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'max', value); |
| }; |
| var _elm_lang$html$Html_Attributes$min = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'min', value); |
| }; |
| var _elm_lang$html$Html_Attributes$step = function (n) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'step', n); |
| }; |
| var _elm_lang$html$Html_Attributes$cols = function (n) { |
| return A2( |
| _elm_lang$html$Html_Attributes$stringProperty, |
| 'cols', |
| _elm_lang$core$Basics$toString(n)); |
| }; |
| var _elm_lang$html$Html_Attributes$rows = function (n) { |
| return A2( |
| _elm_lang$html$Html_Attributes$stringProperty, |
| 'rows', |
| _elm_lang$core$Basics$toString(n)); |
| }; |
| var _elm_lang$html$Html_Attributes$wrap = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'wrap', value); |
| }; |
| var _elm_lang$html$Html_Attributes$usemap = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'useMap', value); |
| }; |
| var _elm_lang$html$Html_Attributes$shape = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'shape', value); |
| }; |
| var _elm_lang$html$Html_Attributes$coords = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'coords', value); |
| }; |
| var _elm_lang$html$Html_Attributes$challenge = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'challenge', value); |
| }; |
| var _elm_lang$html$Html_Attributes$keytype = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'keytype', value); |
| }; |
| var _elm_lang$html$Html_Attributes$align = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'align', value); |
| }; |
| var _elm_lang$html$Html_Attributes$cite = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'cite', value); |
| }; |
| var _elm_lang$html$Html_Attributes$href = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'href', value); |
| }; |
| var _elm_lang$html$Html_Attributes$target = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'target', value); |
| }; |
| var _elm_lang$html$Html_Attributes$downloadAs = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'download', value); |
| }; |
| var _elm_lang$html$Html_Attributes$hreflang = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'hreflang', value); |
| }; |
| var _elm_lang$html$Html_Attributes$media = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'media', value); |
| }; |
| var _elm_lang$html$Html_Attributes$ping = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'ping', value); |
| }; |
| var _elm_lang$html$Html_Attributes$rel = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'rel', value); |
| }; |
| var _elm_lang$html$Html_Attributes$start = function (n) { |
| return A2( |
| _elm_lang$html$Html_Attributes$stringProperty, |
| 'start', |
| _elm_lang$core$Basics$toString(n)); |
| }; |
| var _elm_lang$html$Html_Attributes$headers = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'headers', value); |
| }; |
| var _elm_lang$html$Html_Attributes$scope = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'scope', value); |
| }; |
| var _elm_lang$html$Html_Attributes$manifest = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$stringProperty, 'manifest', value); |
| }; |
| var _elm_lang$html$Html_Attributes$boolProperty = F2( |
| function (name, bool) { |
| return A2( |
| _elm_lang$html$Html_Attributes$property, |
| name, |
| _elm_lang$core$Json_Encode$bool(bool)); |
| }); |
| var _elm_lang$html$Html_Attributes$hidden = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'hidden', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$contenteditable = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'contentEditable', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$spellcheck = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'spellcheck', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$async = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'async', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$defer = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'defer', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$scoped = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'scoped', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$autoplay = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'autoplay', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$controls = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'controls', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$loop = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'loop', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$default = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'default', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$seamless = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'seamless', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$checked = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'checked', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$selected = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'selected', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$autofocus = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'autofocus', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$disabled = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'disabled', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$multiple = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'multiple', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$novalidate = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'noValidate', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$readonly = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'readOnly', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$required = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'required', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$ismap = function (value) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'isMap', value); |
| }; |
| var _elm_lang$html$Html_Attributes$download = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'download', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$reversed = function (bool) { |
| return A2(_elm_lang$html$Html_Attributes$boolProperty, 'reversed', bool); |
| }; |
| var _elm_lang$html$Html_Attributes$classList = function (list) { |
| return _elm_lang$html$Html_Attributes$class( |
| A2( |
| _elm_lang$core$String$join, |
| ' ', |
| A2( |
| _elm_lang$core$List$map, |
| _elm_lang$core$Basics$fst, |
| A2(_elm_lang$core$List$filter, _elm_lang$core$Basics$snd, list)))); |
| }; |
| var _elm_lang$html$Html_Attributes$style = _elm_lang$virtual_dom$VirtualDom$style; |
| |
| var _elm_lang$html$Html_Events$keyCode = A2(_elm_lang$core$Json_Decode_ops[':='], 'keyCode', _elm_lang$core$Json_Decode$int); |
| var _elm_lang$html$Html_Events$targetChecked = A2( |
| _elm_lang$core$Json_Decode$at, |
| _elm_lang$core$Native_List.fromArray( |
| ['target', 'checked']), |
| _elm_lang$core$Json_Decode$bool); |
| var _elm_lang$html$Html_Events$targetValue = A2( |
| _elm_lang$core$Json_Decode$at, |
| _elm_lang$core$Native_List.fromArray( |
| ['target', 'value']), |
| _elm_lang$core$Json_Decode$string); |
| var _elm_lang$html$Html_Events$defaultOptions = _elm_lang$virtual_dom$VirtualDom$defaultOptions; |
| var _elm_lang$html$Html_Events$onWithOptions = _elm_lang$virtual_dom$VirtualDom$onWithOptions; |
| var _elm_lang$html$Html_Events$on = _elm_lang$virtual_dom$VirtualDom$on; |
| var _elm_lang$html$Html_Events$onFocus = function (msg) { |
| return A2( |
| _elm_lang$html$Html_Events$on, |
| 'focus', |
| _elm_lang$core$Json_Decode$succeed(msg)); |
| }; |
| var _elm_lang$html$Html_Events$onBlur = function (msg) { |
| return A2( |
| _elm_lang$html$Html_Events$on, |
| 'blur', |
| _elm_lang$core$Json_Decode$succeed(msg)); |
| }; |
| var _elm_lang$html$Html_Events$onSubmitOptions = _elm_lang$core$Native_Utils.update( |
| _elm_lang$html$Html_Events$defaultOptions, |
| {preventDefault: true}); |
| var _elm_lang$html$Html_Events$onSubmit = function (msg) { |
| return A3( |
| _elm_lang$html$Html_Events$onWithOptions, |
| 'submit', |
| _elm_lang$html$Html_Events$onSubmitOptions, |
| _elm_lang$core$Json_Decode$succeed(msg)); |
| }; |
| var _elm_lang$html$Html_Events$onCheck = function (tagger) { |
| return A2( |
| _elm_lang$html$Html_Events$on, |
| 'change', |
| A2(_elm_lang$core$Json_Decode$map, tagger, _elm_lang$html$Html_Events$targetChecked)); |
| }; |
| var _elm_lang$html$Html_Events$onInput = function (tagger) { |
| return A2( |
| _elm_lang$html$Html_Events$on, |
| 'input', |
| A2(_elm_lang$core$Json_Decode$map, tagger, _elm_lang$html$Html_Events$targetValue)); |
| }; |
| var _elm_lang$html$Html_Events$onMouseOut = function (msg) { |
| return A2( |
| _elm_lang$html$Html_Events$on, |
| 'mouseout', |
| _elm_lang$core$Json_Decode$succeed(msg)); |
| }; |
| var _elm_lang$html$Html_Events$onMouseOver = function (msg) { |
| return A2( |
| _elm_lang$html$Html_Events$on, |
| 'mouseover', |
| _elm_lang$core$Json_Decode$succeed(msg)); |
| }; |
| var _elm_lang$html$Html_Events$onMouseLeave = function (msg) { |
| return A2( |
| _elm_lang$html$Html_Events$on, |
| 'mouseleave', |
| _elm_lang$core$Json_Decode$succeed(msg)); |
| }; |
| var _elm_lang$html$Html_Events$onMouseEnter = function (msg) { |
| return A2( |
| _elm_lang$html$Html_Events$on, |
| 'mouseenter', |
| _elm_lang$core$Json_Decode$succeed(msg)); |
| }; |
| var _elm_lang$html$Html_Events$onMouseUp = function (msg) { |
| return A2( |
| _elm_lang$html$Html_Events$on, |
| 'mouseup', |
| _elm_lang$core$Json_Decode$succeed(msg)); |
| }; |
| var _elm_lang$html$Html_Events$onMouseDown = function (msg) { |
| return A2( |
| _elm_lang$html$Html_Events$on, |
| 'mousedown', |
| _elm_lang$core$Json_Decode$succeed(msg)); |
| }; |
| var _elm_lang$html$Html_Events$onDoubleClick = function (msg) { |
| return A2( |
| _elm_lang$html$Html_Events$on, |
| 'dblclick', |
| _elm_lang$core$Json_Decode$succeed(msg)); |
| }; |
| var _elm_lang$html$Html_Events$onClick = function (msg) { |
| return A2( |
| _elm_lang$html$Html_Events$on, |
| 'click', |
| _elm_lang$core$Json_Decode$succeed(msg)); |
| }; |
| var _elm_lang$html$Html_Events$Options = F2( |
| function (a, b) { |
| return {stopPropagation: a, preventDefault: b}; |
| }); |
| |
| var _elm_lang$html$Html_Lazy$lazy3 = _elm_lang$virtual_dom$VirtualDom$lazy3; |
| var _elm_lang$html$Html_Lazy$lazy2 = _elm_lang$virtual_dom$VirtualDom$lazy2; |
| var _elm_lang$html$Html_Lazy$lazy = _elm_lang$virtual_dom$VirtualDom$lazy; |
| |
| var _elm_lang$navigation$Native_Navigation = function() { |
| |
| function go(n) |
| { |
| return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) |
| { |
| if (n !== 0) |
| { |
| history.go(n); |
| } |
| callback(_elm_lang$core$Native_Scheduler.succeed(_elm_lang$core$Native_Utils.Tuple0)); |
| }); |
| } |
| |
| function pushState(url) |
| { |
| return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) |
| { |
| history.pushState({}, '', url); |
| callback(_elm_lang$core$Native_Scheduler.succeed(getLocation())); |
| }); |
| } |
| |
| function replaceState(url) |
| { |
| return _elm_lang$core$Native_Scheduler.nativeBinding(function(callback) |
| { |
| history.replaceState({}, '', url); |
| callback(_elm_lang$core$Native_Scheduler.succeed(getLocation())); |
| }); |
| } |
| |
| function getLocation() |
| { |
| var location = document.location; |
| |
| return { |
| href: location.href, |
| host: location.host, |
| hostname: location.hostname, |
| protocol: location.protocol, |
| origin: location.origin, |
| port_: location.port, |
| pathname: location.pathname, |
| search: location.search, |
| hash: location.hash, |
| username: location.username, |
| password: location.password |
| }; |
| } |
| |
| |
| return { |
| go: go, |
| pushState: pushState, |
| replaceState: replaceState, |
| getLocation: getLocation |
| }; |
| |
| }(); |
| |
| var _elm_lang$navigation$Navigation$replaceState = _elm_lang$navigation$Native_Navigation.replaceState; |
| var _elm_lang$navigation$Navigation$pushState = _elm_lang$navigation$Native_Navigation.pushState; |
| var _elm_lang$navigation$Navigation$go = _elm_lang$navigation$Native_Navigation.go; |
| var _elm_lang$navigation$Navigation$spawnPopState = function (router) { |
| return _elm_lang$core$Process$spawn( |
| A3( |
| _elm_lang$dom$Dom_LowLevel$onWindow, |
| 'popstate', |
| _elm_lang$core$Json_Decode$value, |
| function (_p0) { |
| return A2( |
| _elm_lang$core$Platform$sendToSelf, |
| router, |
| _elm_lang$navigation$Native_Navigation.getLocation( |
| {ctor: '_Tuple0'})); |
| })); |
| }; |
| var _elm_lang$navigation$Navigation_ops = _elm_lang$navigation$Navigation_ops || {}; |
| _elm_lang$navigation$Navigation_ops['&>'] = F2( |
| function (task1, task2) { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| task1, |
| function (_p1) { |
| return task2; |
| }); |
| }); |
| var _elm_lang$navigation$Navigation$notify = F3( |
| function (router, subs, location) { |
| var send = function (_p2) { |
| var _p3 = _p2; |
| return A2( |
| _elm_lang$core$Platform$sendToApp, |
| router, |
| _p3._0(location)); |
| }; |
| return A2( |
| _elm_lang$navigation$Navigation_ops['&>'], |
| _elm_lang$core$Task$sequence( |
| A2(_elm_lang$core$List$map, send, subs)), |
| _elm_lang$core$Task$succeed( |
| {ctor: '_Tuple0'})); |
| }); |
| var _elm_lang$navigation$Navigation$onSelfMsg = F3( |
| function (router, location, state) { |
| return A2( |
| _elm_lang$navigation$Navigation_ops['&>'], |
| A3(_elm_lang$navigation$Navigation$notify, router, state.subs, location), |
| _elm_lang$core$Task$succeed(state)); |
| }); |
| var _elm_lang$navigation$Navigation$cmdHelp = F3( |
| function (router, subs, cmd) { |
| var _p4 = cmd; |
| switch (_p4.ctor) { |
| case 'Jump': |
| return _elm_lang$navigation$Navigation$go(_p4._0); |
| case 'New': |
| return A2( |
| _elm_lang$core$Task$andThen, |
| _elm_lang$navigation$Navigation$pushState(_p4._0), |
| A2(_elm_lang$navigation$Navigation$notify, router, subs)); |
| default: |
| return A2( |
| _elm_lang$core$Task$andThen, |
| _elm_lang$navigation$Navigation$replaceState(_p4._0), |
| A2(_elm_lang$navigation$Navigation$notify, router, subs)); |
| } |
| }); |
| var _elm_lang$navigation$Navigation$updateHelp = F2( |
| function (func, _p5) { |
| var _p6 = _p5; |
| return { |
| ctor: '_Tuple2', |
| _0: _p6._0, |
| _1: A2(_elm_lang$core$Platform_Cmd$map, func, _p6._1) |
| }; |
| }); |
| var _elm_lang$navigation$Navigation$subscription = _elm_lang$core$Native_Platform.leaf('Navigation'); |
| var _elm_lang$navigation$Navigation$command = _elm_lang$core$Native_Platform.leaf('Navigation'); |
| var _elm_lang$navigation$Navigation$Location = function (a) { |
| return function (b) { |
| return function (c) { |
| return function (d) { |
| return function (e) { |
| return function (f) { |
| return function (g) { |
| return function (h) { |
| return function (i) { |
| return function (j) { |
| return function (k) { |
| return {href: a, host: b, hostname: c, protocol: d, origin: e, port_: f, pathname: g, search: h, hash: i, username: j, password: k}; |
| }; |
| }; |
| }; |
| }; |
| }; |
| }; |
| }; |
| }; |
| }; |
| }; |
| }; |
| var _elm_lang$navigation$Navigation$State = F2( |
| function (a, b) { |
| return {subs: a, process: b}; |
| }); |
| var _elm_lang$navigation$Navigation$init = _elm_lang$core$Task$succeed( |
| A2( |
| _elm_lang$navigation$Navigation$State, |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| _elm_lang$core$Maybe$Nothing)); |
| var _elm_lang$navigation$Navigation$onEffects = F4( |
| function (router, cmds, subs, _p7) { |
| var _p8 = _p7; |
| var _p10 = _p8.process; |
| var stepState = function () { |
| var _p9 = {ctor: '_Tuple2', _0: subs, _1: _p10}; |
| _v4_2: |
| do { |
| if (_p9._0.ctor === '[]') { |
| if (_p9._1.ctor === 'Just') { |
| return A2( |
| _elm_lang$navigation$Navigation_ops['&>'], |
| _elm_lang$core$Process$kill(_p9._1._0), |
| _elm_lang$core$Task$succeed( |
| A2(_elm_lang$navigation$Navigation$State, subs, _elm_lang$core$Maybe$Nothing))); |
| } else { |
| break _v4_2; |
| } |
| } else { |
| if (_p9._1.ctor === 'Nothing') { |
| return A2( |
| _elm_lang$core$Task$andThen, |
| _elm_lang$navigation$Navigation$spawnPopState(router), |
| function (pid) { |
| return _elm_lang$core$Task$succeed( |
| A2( |
| _elm_lang$navigation$Navigation$State, |
| subs, |
| _elm_lang$core$Maybe$Just(pid))); |
| }); |
| } else { |
| break _v4_2; |
| } |
| } |
| } while(false); |
| return _elm_lang$core$Task$succeed( |
| A2(_elm_lang$navigation$Navigation$State, subs, _p10)); |
| }(); |
| return A2( |
| _elm_lang$navigation$Navigation_ops['&>'], |
| _elm_lang$core$Task$sequence( |
| A2( |
| _elm_lang$core$List$map, |
| A2(_elm_lang$navigation$Navigation$cmdHelp, router, subs), |
| cmds)), |
| stepState); |
| }); |
| var _elm_lang$navigation$Navigation$UserMsg = function (a) { |
| return {ctor: 'UserMsg', _0: a}; |
| }; |
| var _elm_lang$navigation$Navigation$Change = function (a) { |
| return {ctor: 'Change', _0: a}; |
| }; |
| var _elm_lang$navigation$Navigation$Parser = function (a) { |
| return {ctor: 'Parser', _0: a}; |
| }; |
| var _elm_lang$navigation$Navigation$makeParser = _elm_lang$navigation$Navigation$Parser; |
| var _elm_lang$navigation$Navigation$Modify = function (a) { |
| return {ctor: 'Modify', _0: a}; |
| }; |
| var _elm_lang$navigation$Navigation$modifyUrl = function (url) { |
| return _elm_lang$navigation$Navigation$command( |
| _elm_lang$navigation$Navigation$Modify(url)); |
| }; |
| var _elm_lang$navigation$Navigation$New = function (a) { |
| return {ctor: 'New', _0: a}; |
| }; |
| var _elm_lang$navigation$Navigation$newUrl = function (url) { |
| return _elm_lang$navigation$Navigation$command( |
| _elm_lang$navigation$Navigation$New(url)); |
| }; |
| var _elm_lang$navigation$Navigation$Jump = function (a) { |
| return {ctor: 'Jump', _0: a}; |
| }; |
| var _elm_lang$navigation$Navigation$back = function (n) { |
| return _elm_lang$navigation$Navigation$command( |
| _elm_lang$navigation$Navigation$Jump(0 - n)); |
| }; |
| var _elm_lang$navigation$Navigation$forward = function (n) { |
| return _elm_lang$navigation$Navigation$command( |
| _elm_lang$navigation$Navigation$Jump(n)); |
| }; |
| var _elm_lang$navigation$Navigation$cmdMap = F2( |
| function (_p11, myCmd) { |
| var _p12 = myCmd; |
| switch (_p12.ctor) { |
| case 'Jump': |
| return _elm_lang$navigation$Navigation$Jump(_p12._0); |
| case 'New': |
| return _elm_lang$navigation$Navigation$New(_p12._0); |
| default: |
| return _elm_lang$navigation$Navigation$Modify(_p12._0); |
| } |
| }); |
| var _elm_lang$navigation$Navigation$Monitor = function (a) { |
| return {ctor: 'Monitor', _0: a}; |
| }; |
| var _elm_lang$navigation$Navigation$programWithFlags = F2( |
| function (_p13, stuff) { |
| var _p14 = _p13; |
| var _p16 = _p14._0; |
| var location = _elm_lang$navigation$Native_Navigation.getLocation( |
| {ctor: '_Tuple0'}); |
| var init = function (flags) { |
| return A2( |
| _elm_lang$navigation$Navigation$updateHelp, |
| _elm_lang$navigation$Navigation$UserMsg, |
| A2( |
| stuff.init, |
| flags, |
| _p16(location))); |
| }; |
| var view = function (model) { |
| return A2( |
| _elm_lang$html$Html_App$map, |
| _elm_lang$navigation$Navigation$UserMsg, |
| stuff.view(model)); |
| }; |
| var subs = function (model) { |
| return _elm_lang$core$Platform_Sub$batch( |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$navigation$Navigation$subscription( |
| _elm_lang$navigation$Navigation$Monitor(_elm_lang$navigation$Navigation$Change)), |
| A2( |
| _elm_lang$core$Platform_Sub$map, |
| _elm_lang$navigation$Navigation$UserMsg, |
| stuff.subscriptions(model)) |
| ])); |
| }; |
| var update = F2( |
| function (msg, model) { |
| return A2( |
| _elm_lang$navigation$Navigation$updateHelp, |
| _elm_lang$navigation$Navigation$UserMsg, |
| function () { |
| var _p15 = msg; |
| if (_p15.ctor === 'Change') { |
| return A2( |
| stuff.urlUpdate, |
| _p16(_p15._0), |
| model); |
| } else { |
| return A2(stuff.update, _p15._0, model); |
| } |
| }()); |
| }); |
| return _elm_lang$html$Html_App$programWithFlags( |
| {init: init, view: view, update: update, subscriptions: subs}); |
| }); |
| var _elm_lang$navigation$Navigation$program = F2( |
| function (parser, stuff) { |
| return A2( |
| _elm_lang$navigation$Navigation$programWithFlags, |
| parser, |
| _elm_lang$core$Native_Utils.update( |
| stuff, |
| { |
| init: function (_p17) { |
| return stuff.init; |
| } |
| })); |
| }); |
| var _elm_lang$navigation$Navigation$subMap = F2( |
| function (func, _p18) { |
| var _p19 = _p18; |
| return _elm_lang$navigation$Navigation$Monitor( |
| function (_p20) { |
| return func( |
| _p19._0(_p20)); |
| }); |
| }); |
| _elm_lang$core$Native_Platform.effectManagers['Navigation'] = {pkg: 'elm-lang/navigation', init: _elm_lang$navigation$Navigation$init, onEffects: _elm_lang$navigation$Navigation$onEffects, onSelfMsg: _elm_lang$navigation$Navigation$onSelfMsg, tag: 'fx', cmdMap: _elm_lang$navigation$Navigation$cmdMap, subMap: _elm_lang$navigation$Navigation$subMap}; |
| |
| var _evancz$elm_todomvc$Todo_Task$onFinish = F2( |
| function (enterMessage, escapeMessage) { |
| var select = function (key) { |
| var _p0 = key; |
| if (_p0 === 13) { |
| return enterMessage; |
| } else { |
| return escapeMessage; |
| } |
| }; |
| return A2( |
| _elm_lang$html$Html_Events$on, |
| 'keydown', |
| A2(_elm_lang$core$Json_Decode$map, select, _elm_lang$html$Html_Events$keyCode)); |
| }); |
| var _evancz$elm_todomvc$Todo_Task$update = F2( |
| function (msg, model) { |
| var _p1 = msg; |
| switch (_p1.ctor) { |
| case 'Focus': |
| return _elm_lang$core$Maybe$Just( |
| _elm_lang$core$Native_Utils.update( |
| model, |
| { |
| edits: _elm_lang$core$Maybe$Just(model.description) |
| })); |
| case 'Edit': |
| return _elm_lang$core$Maybe$Just( |
| _elm_lang$core$Native_Utils.update( |
| model, |
| { |
| edits: _elm_lang$core$Maybe$Just(_p1._0) |
| })); |
| case 'Cancel': |
| return _elm_lang$core$Maybe$Just( |
| _elm_lang$core$Native_Utils.update( |
| model, |
| {edits: _elm_lang$core$Maybe$Nothing})); |
| case 'Commit': |
| var _p2 = model.edits; |
| if (_p2.ctor === 'Nothing') { |
| return _elm_lang$core$Maybe$Just(model); |
| } else { |
| var description = _elm_lang$core$String$trim(_p2._0); |
| return _elm_lang$core$String$isEmpty(description) ? _elm_lang$core$Maybe$Nothing : _elm_lang$core$Maybe$Just( |
| _elm_lang$core$Native_Utils.update( |
| model, |
| {edits: _elm_lang$core$Maybe$Nothing, description: description})); |
| } |
| case 'Completed': |
| return _elm_lang$core$Maybe$Just( |
| _elm_lang$core$Native_Utils.update( |
| model, |
| {completed: _p1._0})); |
| default: |
| return _elm_lang$core$Maybe$Nothing; |
| } |
| }); |
| var _evancz$elm_todomvc$Todo_Task$init = F2( |
| function (desc, id) { |
| return {description: desc, completed: false, edits: _elm_lang$core$Maybe$Nothing, id: id}; |
| }); |
| var _evancz$elm_todomvc$Todo_Task$Model = F4( |
| function (a, b, c, d) { |
| return {description: a, completed: b, edits: c, id: d}; |
| }); |
| var _evancz$elm_todomvc$Todo_Task$Delete = {ctor: 'Delete'}; |
| var _evancz$elm_todomvc$Todo_Task$Completed = function (a) { |
| return {ctor: 'Completed', _0: a}; |
| }; |
| var _evancz$elm_todomvc$Todo_Task$Commit = {ctor: 'Commit'}; |
| var _evancz$elm_todomvc$Todo_Task$Cancel = {ctor: 'Cancel'}; |
| var _evancz$elm_todomvc$Todo_Task$Edit = function (a) { |
| return {ctor: 'Edit', _0: a}; |
| }; |
| var _evancz$elm_todomvc$Todo_Task$Focus = function (a) { |
| return {ctor: 'Focus', _0: a}; |
| }; |
| var _evancz$elm_todomvc$Todo_Task$view = function (model) { |
| var elementId = A2( |
| _elm_lang$core$Basics_ops['++'], |
| 'todo-', |
| _elm_lang$core$Basics$toString(model.id)); |
| var description = A2(_elm_lang$core$Maybe$withDefault, model.description, model.edits); |
| var className = A2( |
| _elm_lang$core$Basics_ops['++'], |
| model.completed ? 'completed ' : '', |
| function () { |
| var _p3 = model.edits; |
| if (_p3.ctor === 'Just') { |
| return 'editing'; |
| } else { |
| return ''; |
| } |
| }()); |
| return A2( |
| _elm_lang$html$Html$li, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class(className) |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| A2( |
| _elm_lang$html$Html$div, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('view') |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| A2( |
| _elm_lang$html$Html$input, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('toggle'), |
| _elm_lang$html$Html_Attributes$type$('checkbox'), |
| _elm_lang$html$Html_Attributes$checked(model.completed), |
| _elm_lang$html$Html_Events$onClick( |
| _evancz$elm_todomvc$Todo_Task$Completed( |
| _elm_lang$core$Basics$not(model.completed))) |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [])), |
| A2( |
| _elm_lang$html$Html$label, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Events$onDoubleClick( |
| _evancz$elm_todomvc$Todo_Task$Focus(elementId)) |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html$text(description) |
| ])), |
| A2( |
| _elm_lang$html$Html$button, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('destroy'), |
| _elm_lang$html$Html_Events$onClick(_evancz$elm_todomvc$Todo_Task$Delete) |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [])) |
| ])), |
| A2( |
| _elm_lang$html$Html$input, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('edit'), |
| _elm_lang$html$Html_Attributes$value(description), |
| _elm_lang$html$Html_Attributes$name('title'), |
| _elm_lang$html$Html_Attributes$id(elementId), |
| _elm_lang$html$Html_Events$onInput(_evancz$elm_todomvc$Todo_Task$Edit), |
| _elm_lang$html$Html_Events$onBlur(_evancz$elm_todomvc$Todo_Task$Commit), |
| A2(_evancz$elm_todomvc$Todo_Task$onFinish, _evancz$elm_todomvc$Todo_Task$Commit, _evancz$elm_todomvc$Todo_Task$Cancel) |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [])) |
| ])); |
| }; |
| |
| var _evancz$elm_todomvc$Todo$subscriptions = function (model) { |
| return _elm_lang$core$Platform_Sub$none; |
| }; |
| var _evancz$elm_todomvc$Todo$fromUrl = function (hash) { |
| var cleanHash = A2(_elm_lang$core$String$dropLeft, 2, hash); |
| return _elm_lang$core$Native_Utils.eq( |
| A2( |
| _elm_lang$core$List$member, |
| cleanHash, |
| _elm_lang$core$Native_List.fromArray( |
| ['all', 'active', 'completed'])), |
| true) ? _elm_lang$core$Maybe$Just(cleanHash) : _elm_lang$core$Maybe$Nothing; |
| }; |
| var _evancz$elm_todomvc$Todo$urlParser = _elm_lang$navigation$Navigation$makeParser( |
| function (_p0) { |
| return _evancz$elm_todomvc$Todo$fromUrl( |
| function (_) { |
| return _.hash; |
| }(_p0)); |
| }); |
| var _evancz$elm_todomvc$Todo$toUrl = function (visibility) { |
| return A2( |
| _elm_lang$core$Basics_ops['++'], |
| '#/', |
| _elm_lang$core$String$toLower(visibility)); |
| }; |
| var _evancz$elm_todomvc$Todo$infoFooter = A2( |
| _elm_lang$html$Html$footer, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('info') |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| A2( |
| _elm_lang$html$Html$p, |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html$text('Double-click to edit a todo') |
| ])), |
| A2( |
| _elm_lang$html$Html$p, |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html$text('Written by '), |
| A2( |
| _elm_lang$html$Html$a, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$href('https://github.com/evancz') |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html$text('Evan Czaplicki') |
| ])) |
| ])), |
| A2( |
| _elm_lang$html$Html$p, |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html$text('Part of '), |
| A2( |
| _elm_lang$html$Html$a, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$href('http://todomvc.com') |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html$text('TodoMVC') |
| ])) |
| ])) |
| ])); |
| var _evancz$elm_todomvc$Todo$emptyModel = { |
| tasks: _elm_lang$core$Native_List.fromArray( |
| []), |
| visibility: 'All', |
| field: '', |
| uid: 0 |
| }; |
| var _evancz$elm_todomvc$Todo$save = _elm_lang$core$Native_Platform.outgoingPort( |
| 'save', |
| function (v) { |
| return { |
| tasks: _elm_lang$core$Native_List.toArray(v.tasks).map( |
| function (v) { |
| return { |
| description: v.description, |
| completed: v.completed, |
| edits: (v.edits.ctor === 'Nothing') ? null : v.edits._0, |
| id: v.id |
| }; |
| }), |
| field: v.field, |
| uid: v.uid, |
| visibility: v.visibility |
| }; |
| }); |
| var _evancz$elm_todomvc$Todo$Model = F4( |
| function (a, b, c, d) { |
| return {tasks: a, field: b, uid: c, visibility: d}; |
| }); |
| var _evancz$elm_todomvc$Todo$ChangeVisibility = function (a) { |
| return {ctor: 'ChangeVisibility', _0: a}; |
| }; |
| var _evancz$elm_todomvc$Todo$visibilitySwap = F3( |
| function (uri, visibility, actualVisibility) { |
| var className = _elm_lang$core$Native_Utils.eq(visibility, actualVisibility) ? 'selected' : ''; |
| return A2( |
| _elm_lang$html$Html$li, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Events$onClick( |
| _evancz$elm_todomvc$Todo$ChangeVisibility(visibility)) |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| A2( |
| _elm_lang$html$Html$a, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class(className), |
| _elm_lang$html$Html_Attributes$href(uri) |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html$text(visibility) |
| ])) |
| ])); |
| }); |
| var _evancz$elm_todomvc$Todo$CheckAll = function (a) { |
| return {ctor: 'CheckAll', _0: a}; |
| }; |
| var _evancz$elm_todomvc$Todo$DeleteComplete = {ctor: 'DeleteComplete'}; |
| var _evancz$elm_todomvc$Todo$controls = F2( |
| function (visibility, tasks) { |
| var tasksCompleted = _elm_lang$core$List$length( |
| A2( |
| _elm_lang$core$List$filter, |
| function (_) { |
| return _.completed; |
| }, |
| tasks)); |
| var tasksLeft = _elm_lang$core$List$length(tasks) - tasksCompleted; |
| var item_ = _elm_lang$core$Native_Utils.eq(tasksLeft, 1) ? ' item' : ' items'; |
| return A2( |
| _elm_lang$html$Html$footer, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('footer'), |
| _elm_lang$html$Html_Attributes$hidden( |
| _elm_lang$core$List$isEmpty(tasks)) |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| A2( |
| _elm_lang$html$Html$span, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('todo-count') |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| A2( |
| _elm_lang$html$Html$strong, |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html$text( |
| _elm_lang$core$Basics$toString(tasksLeft)) |
| ])), |
| _elm_lang$html$Html$text( |
| A2(_elm_lang$core$Basics_ops['++'], item_, ' left')) |
| ])), |
| A2( |
| _elm_lang$html$Html$ul, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('filters') |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| A3(_evancz$elm_todomvc$Todo$visibilitySwap, '#/', 'All', visibility), |
| _elm_lang$html$Html$text(' '), |
| A3(_evancz$elm_todomvc$Todo$visibilitySwap, '#/active', 'Active', visibility), |
| _elm_lang$html$Html$text(' '), |
| A3(_evancz$elm_todomvc$Todo$visibilitySwap, '#/completed', 'Completed', visibility) |
| ])), |
| A2( |
| _elm_lang$html$Html$button, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('clear-completed'), |
| _elm_lang$html$Html_Attributes$hidden( |
| _elm_lang$core$Native_Utils.eq(tasksCompleted, 0)), |
| _elm_lang$html$Html_Events$onClick(_evancz$elm_todomvc$Todo$DeleteComplete) |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html$text( |
| A2( |
| _elm_lang$core$Basics_ops['++'], |
| 'Clear completed (', |
| A2( |
| _elm_lang$core$Basics_ops['++'], |
| _elm_lang$core$Basics$toString(tasksCompleted), |
| ')'))) |
| ])) |
| ])); |
| }); |
| var _evancz$elm_todomvc$Todo$UpdateTask = function (a) { |
| return {ctor: 'UpdateTask', _0: a}; |
| }; |
| var _evancz$elm_todomvc$Todo$taskList = F2( |
| function (visibility, tasks) { |
| var cssVisibility = _elm_lang$core$List$isEmpty(tasks) ? 'hidden' : 'visible'; |
| var allCompleted = A2( |
| _elm_lang$core$List$all, |
| function (_) { |
| return _.completed; |
| }, |
| tasks); |
| var isVisible = function (todo) { |
| var _p1 = visibility; |
| switch (_p1) { |
| case 'Completed': |
| return todo.completed; |
| case 'Active': |
| return _elm_lang$core$Basics$not(todo.completed); |
| default: |
| return true; |
| } |
| }; |
| return A2( |
| _elm_lang$html$Html$section, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('main'), |
| _elm_lang$html$Html_Attributes$style( |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| {ctor: '_Tuple2', _0: 'visibility', _1: cssVisibility} |
| ])) |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| A2( |
| _elm_lang$html$Html$input, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('toggle-all'), |
| _elm_lang$html$Html_Attributes$type$('checkbox'), |
| _elm_lang$html$Html_Attributes$name('toggle'), |
| _elm_lang$html$Html_Attributes$checked(allCompleted), |
| _elm_lang$html$Html_Events$onClick( |
| _evancz$elm_todomvc$Todo$CheckAll( |
| _elm_lang$core$Basics$not(allCompleted))) |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [])), |
| A2( |
| _elm_lang$html$Html$label, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$for('toggle-all') |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html$text('Mark all as complete') |
| ])), |
| A2( |
| _elm_lang$html$Html$ul, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('todo-list') |
| ]), |
| A2( |
| _elm_lang$core$List$map, |
| function (task) { |
| var taskView = _evancz$elm_todomvc$Todo_Task$view(task); |
| var id = task.id; |
| return A2( |
| _elm_lang$html$Html_App$map, |
| function (msg) { |
| return _evancz$elm_todomvc$Todo$UpdateTask( |
| {ctor: '_Tuple2', _0: id, _1: msg}); |
| }, |
| taskView); |
| }, |
| A2(_elm_lang$core$List$filter, isVisible, tasks))) |
| ])); |
| }); |
| var _evancz$elm_todomvc$Todo$Add = {ctor: 'Add'}; |
| var _evancz$elm_todomvc$Todo$UpdateField = function (a) { |
| return {ctor: 'UpdateField', _0: a}; |
| }; |
| var _evancz$elm_todomvc$Todo$NoOp = {ctor: 'NoOp'}; |
| var _evancz$elm_todomvc$Todo$focusTask = function (elementId) { |
| return A3( |
| _elm_lang$core$Task$perform, |
| function (_p2) { |
| return _evancz$elm_todomvc$Todo$NoOp; |
| }, |
| function (_p3) { |
| return _evancz$elm_todomvc$Todo$NoOp; |
| }, |
| _elm_lang$dom$Dom$focus(elementId)); |
| }; |
| var _evancz$elm_todomvc$Todo$update = F2( |
| function (msg, model) { |
| var _p4 = A2(_elm_lang$core$Debug$log, 'MESSAGE: ', msg); |
| switch (_p4.ctor) { |
| case 'NoOp': |
| return {ctor: '_Tuple2', _0: model, _1: _elm_lang$core$Platform_Cmd$none}; |
| case 'UpdateField': |
| var newModel = _elm_lang$core$Native_Utils.update( |
| model, |
| {field: _p4._0}); |
| return { |
| ctor: '_Tuple2', |
| _0: newModel, |
| _1: _evancz$elm_todomvc$Todo$save(model) |
| }; |
| case 'Add': |
| var description = _elm_lang$core$String$trim(model.field); |
| var newModel = _elm_lang$core$String$isEmpty(description) ? model : _elm_lang$core$Native_Utils.update( |
| model, |
| { |
| uid: model.uid + 1, |
| field: '', |
| tasks: A2( |
| _elm_lang$core$Basics_ops['++'], |
| model.tasks, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| A2(_evancz$elm_todomvc$Todo_Task$init, description, model.uid) |
| ])) |
| }); |
| return { |
| ctor: '_Tuple2', |
| _0: newModel, |
| _1: _evancz$elm_todomvc$Todo$save(newModel) |
| }; |
| case 'UpdateTask': |
| var _p6 = _p4._0._1; |
| var updateTask = function (t) { |
| return _elm_lang$core$Native_Utils.eq(t.id, _p4._0._0) ? A2(_evancz$elm_todomvc$Todo_Task$update, _p6, t) : _elm_lang$core$Maybe$Just(t); |
| }; |
| var newModel = _elm_lang$core$Native_Utils.update( |
| model, |
| { |
| tasks: A2(_elm_lang$core$List$filterMap, updateTask, model.tasks) |
| }); |
| var _p5 = _p6; |
| if (_p5.ctor === 'Focus') { |
| return A2( |
| _elm_lang$core$Platform_Cmd_ops['!'], |
| newModel, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _evancz$elm_todomvc$Todo$save(newModel), |
| _evancz$elm_todomvc$Todo$focusTask(_p5._0) |
| ])); |
| } else { |
| return { |
| ctor: '_Tuple2', |
| _0: newModel, |
| _1: _evancz$elm_todomvc$Todo$save(newModel) |
| }; |
| } |
| case 'DeleteComplete': |
| var newModel = _elm_lang$core$Native_Utils.update( |
| model, |
| { |
| tasks: A2( |
| _elm_lang$core$List$filter, |
| function (_p7) { |
| return _elm_lang$core$Basics$not( |
| function (_) { |
| return _.completed; |
| }(_p7)); |
| }, |
| model.tasks) |
| }); |
| return { |
| ctor: '_Tuple2', |
| _0: newModel, |
| _1: _evancz$elm_todomvc$Todo$save(newModel) |
| }; |
| case 'CheckAll': |
| var updateTask = function (t) { |
| return _elm_lang$core$Native_Utils.update( |
| t, |
| {completed: _p4._0}); |
| }; |
| var newModel = _elm_lang$core$Native_Utils.update( |
| model, |
| { |
| tasks: A2(_elm_lang$core$List$map, updateTask, model.tasks) |
| }); |
| return { |
| ctor: '_Tuple2', |
| _0: newModel, |
| _1: _evancz$elm_todomvc$Todo$save(newModel) |
| }; |
| default: |
| var newModel = _elm_lang$core$Native_Utils.update( |
| model, |
| {visibility: _p4._0}); |
| return { |
| ctor: '_Tuple2', |
| _0: newModel, |
| _1: _evancz$elm_todomvc$Todo$save(model) |
| }; |
| } |
| }); |
| var _evancz$elm_todomvc$Todo$urlUpdate = F2( |
| function (result, model) { |
| var _p8 = result; |
| if (_p8.ctor === 'Just') { |
| return A2( |
| _evancz$elm_todomvc$Todo$update, |
| _evancz$elm_todomvc$Todo$ChangeVisibility( |
| _elm_community$string_extra$String_Extra$toSentenceCase(_p8._0)), |
| model); |
| } else { |
| return A2( |
| _evancz$elm_todomvc$Todo$update, |
| _evancz$elm_todomvc$Todo$ChangeVisibility('All'), |
| model); |
| } |
| }); |
| var _evancz$elm_todomvc$Todo$init = F2( |
| function (flags, url) { |
| return A2( |
| _evancz$elm_todomvc$Todo$urlUpdate, |
| url, |
| A2(_elm_lang$core$Maybe$withDefault, _evancz$elm_todomvc$Todo$emptyModel, flags)); |
| }); |
| var _evancz$elm_todomvc$Todo$taskEntry = function (task) { |
| return A2( |
| _elm_lang$html$Html$header, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('header') |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| A2( |
| _elm_lang$html$Html$h1, |
| _elm_lang$core$Native_List.fromArray( |
| []), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html$text('todos') |
| ])), |
| A2( |
| _elm_lang$html$Html$input, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('new-todo'), |
| _elm_lang$html$Html_Attributes$placeholder('What needs to be done?'), |
| _elm_lang$html$Html_Attributes$autofocus(true), |
| _elm_lang$html$Html_Attributes$value(task), |
| _elm_lang$html$Html_Attributes$name('newTodo'), |
| _elm_lang$html$Html_Events$onInput(_evancz$elm_todomvc$Todo$UpdateField), |
| A2(_evancz$elm_todomvc$Todo_Task$onFinish, _evancz$elm_todomvc$Todo$Add, _evancz$elm_todomvc$Todo$NoOp) |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [])) |
| ])); |
| }; |
| var _evancz$elm_todomvc$Todo$view = function (model) { |
| return A2( |
| _elm_lang$html$Html$div, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('todomvc-wrapper'), |
| _elm_lang$html$Html_Attributes$style( |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| {ctor: '_Tuple2', _0: 'visibility', _1: 'hidden'} |
| ])) |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| A2( |
| _elm_lang$html$Html$section, |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$html$Html_Attributes$class('todoapp') |
| ]), |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| A2(_elm_lang$html$Html_Lazy$lazy, _evancz$elm_todomvc$Todo$taskEntry, model.field), |
| A3(_elm_lang$html$Html_Lazy$lazy2, _evancz$elm_todomvc$Todo$taskList, model.visibility, model.tasks), |
| A3(_elm_lang$html$Html_Lazy$lazy2, _evancz$elm_todomvc$Todo$controls, model.visibility, model.tasks) |
| ])), |
| _evancz$elm_todomvc$Todo$infoFooter |
| ])); |
| }; |
| var _evancz$elm_todomvc$Todo$main = { |
| main: A2( |
| _elm_lang$navigation$Navigation$programWithFlags, |
| _evancz$elm_todomvc$Todo$urlParser, |
| {urlUpdate: _evancz$elm_todomvc$Todo$urlUpdate, view: _evancz$elm_todomvc$Todo$view, init: _evancz$elm_todomvc$Todo$init, update: _evancz$elm_todomvc$Todo$update, subscriptions: _evancz$elm_todomvc$Todo$subscriptions}), |
| flags: _elm_lang$core$Json_Decode$oneOf( |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$core$Json_Decode$null(_elm_lang$core$Maybe$Nothing), |
| A2( |
| _elm_lang$core$Json_Decode$map, |
| _elm_lang$core$Maybe$Just, |
| A2( |
| _elm_lang$core$Json_Decode$andThen, |
| A2(_elm_lang$core$Json_Decode_ops[':='], 'field', _elm_lang$core$Json_Decode$string), |
| function (field) { |
| return A2( |
| _elm_lang$core$Json_Decode$andThen, |
| A2( |
| _elm_lang$core$Json_Decode_ops[':='], |
| 'tasks', |
| _elm_lang$core$Json_Decode$list( |
| A2( |
| _elm_lang$core$Json_Decode$andThen, |
| A2(_elm_lang$core$Json_Decode_ops[':='], 'completed', _elm_lang$core$Json_Decode$bool), |
| function (completed) { |
| return A2( |
| _elm_lang$core$Json_Decode$andThen, |
| A2(_elm_lang$core$Json_Decode_ops[':='], 'description', _elm_lang$core$Json_Decode$string), |
| function (description) { |
| return A2( |
| _elm_lang$core$Json_Decode$andThen, |
| A2( |
| _elm_lang$core$Json_Decode_ops[':='], |
| 'edits', |
| _elm_lang$core$Json_Decode$oneOf( |
| _elm_lang$core$Native_List.fromArray( |
| [ |
| _elm_lang$core$Json_Decode$null(_elm_lang$core$Maybe$Nothing), |
| A2(_elm_lang$core$Json_Decode$map, _elm_lang$core$Maybe$Just, _elm_lang$core$Json_Decode$string) |
| ]))), |
| function (edits) { |
| return A2( |
| _elm_lang$core$Json_Decode$andThen, |
| A2(_elm_lang$core$Json_Decode_ops[':='], 'id', _elm_lang$core$Json_Decode$int), |
| function (id) { |
| return _elm_lang$core$Json_Decode$succeed( |
| {completed: completed, description: description, edits: edits, id: id}); |
| }); |
| }); |
| }); |
| }))), |
| function (tasks) { |
| return A2( |
| _elm_lang$core$Json_Decode$andThen, |
| A2(_elm_lang$core$Json_Decode_ops[':='], 'uid', _elm_lang$core$Json_Decode$int), |
| function (uid) { |
| return A2( |
| _elm_lang$core$Json_Decode$andThen, |
| A2(_elm_lang$core$Json_Decode_ops[':='], 'visibility', _elm_lang$core$Json_Decode$string), |
| function (visibility) { |
| return _elm_lang$core$Json_Decode$succeed( |
| {field: field, tasks: tasks, uid: uid, visibility: visibility}); |
| }); |
| }); |
| }); |
| })) |
| ])) |
| }; |
| |
| var Elm = {}; |
| Elm['Todo'] = Elm['Todo'] || {}; |
| _elm_lang$core$Native_Platform.addPublicModule(Elm['Todo'], 'Todo', typeof _evancz$elm_todomvc$Todo$main === 'undefined' ? null : _evancz$elm_todomvc$Todo$main); |
| |
| if (typeof define === "function" && define['amd']) |
| { |
| define([], function() { return Elm; }); |
| return; |
| } |
| |
| if (typeof module === "object") |
| { |
| module['exports'] = Elm; |
| return; |
| } |
| |
| var globalElm = this['Elm']; |
| if (typeof globalElm === "undefined") |
| { |
| this['Elm'] = Elm; |
| return; |
| } |
| |
| for (var publicModule in Elm) |
| { |
| if (publicModule in globalElm) |
| { |
| throw new Error('There are two Elm modules called `' + publicModule + '` on this page! Rename one of them.'); |
| } |
| globalElm[publicModule] = Elm[publicModule]; |
| } |
| |
| }).call(this); |
| |