drag, zoom, pan!
Last active
December 10, 2015 19:56
-
-
Save capicue/f4d3131f104a80318232 to your computer and use it in GitHub Desktop.
Hexagons 2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE HTML> | |
<html> | |
<head> | |
<meta http-equiv="content-type" content="text/html; charset=utf-8" /> | |
<meta name="viewport" content="width=device-width, initial-scale=1"> | |
<script type="text/javascript" src="Main.js"></script> | |
<link rel="stylesheet" href="main.css" type="text/css" /> | |
<title>Sites</title> | |
</head> | |
<body> | |
<script type="text/javascript"> | |
var app = Elm.fullscreen(Elm.Main); | |
</script> | |
</body> | |
</html> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#app { | |
position: fixed; | |
top: 0; | |
left: 0; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var Elm = Elm || { Native: {} }; | |
Elm.Native.Array = {}; | |
Elm.Native.Array.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Array = localRuntime.Native.Array || {}; | |
if (localRuntime.Native.Array.values) | |
{ | |
return localRuntime.Native.Array.values; | |
} | |
if ('values' in Elm.Native.Array) | |
{ | |
return localRuntime.Native.Array.values = Elm.Native.Array.values; | |
} | |
var List = Elm.Native.List.make(localRuntime); | |
// 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 === List.Nil) | |
{ | |
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_(List.Nil, a); | |
} | |
function toList_(list, a) | |
{ | |
for (var i = a.table.length - 1; i >= 0; i--) | |
{ | |
list = | |
a.height === 0 | |
? 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 | |
}; | |
} | |
Elm.Native.Array.values = { | |
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 | |
}; | |
return localRuntime.Native.Array.values = Elm.Native.Array.values; | |
}; | |
Elm.Native.Basics = {}; | |
Elm.Native.Basics.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Basics = localRuntime.Native.Basics || {}; | |
if (localRuntime.Native.Basics.values) | |
{ | |
return localRuntime.Native.Basics.values; | |
} | |
var Utils = Elm.Native.Utils.make(localRuntime); | |
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 Utils.cmp(a, b) < 0 ? a : b; | |
} | |
function max(a, b) | |
{ | |
return Utils.cmp(a, b) > 0 ? a : b; | |
} | |
function clamp(lo, hi, n) | |
{ | |
return Utils.cmp(n, lo) < 0 ? lo : Utils.cmp(n, hi) > 0 ? hi : n; | |
} | |
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 Utils.Tuple2(r * Math.cos(t), r * Math.sin(t)); | |
} | |
function toPolar(point) | |
{ | |
var x = point._0; | |
var y = point._1; | |
return Utils.Tuple2(Math.sqrt(x * x + y * y), Math.atan2(y, x)); | |
} | |
return localRuntime.Native.Basics.values = { | |
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: Utils.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 | |
}; | |
}; | |
Elm.Native.Port = {}; | |
Elm.Native.Port.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Port = localRuntime.Native.Port || {}; | |
if (localRuntime.Native.Port.values) | |
{ | |
return localRuntime.Native.Port.values; | |
} | |
var NS; | |
// INBOUND | |
function inbound(name, type, converter) | |
{ | |
if (!localRuntime.argsTracker[name]) | |
{ | |
throw new Error( | |
'Port Error:\n' + | |
'No argument was given for the port named \'' + name + '\' with type:\n\n' + | |
' ' + type.split('\n').join('\n ') + '\n\n' + | |
'You need to provide an initial value!\n\n' + | |
'Find out more about ports here <http://elm-lang.org/learn/Ports.elm>' | |
); | |
} | |
var arg = localRuntime.argsTracker[name]; | |
arg.used = true; | |
return jsToElm(name, type, converter, arg.value); | |
} | |
function inboundSignal(name, type, converter) | |
{ | |
var initialValue = inbound(name, type, converter); | |
if (!NS) | |
{ | |
NS = Elm.Native.Signal.make(localRuntime); | |
} | |
var signal = NS.input('inbound-port-' + name, initialValue); | |
function send(jsValue) | |
{ | |
var elmValue = jsToElm(name, type, converter, jsValue); | |
setTimeout(function() { | |
localRuntime.notify(signal.id, elmValue); | |
}, 0); | |
} | |
localRuntime.ports[name] = { send: send }; | |
return signal; | |
} | |
function jsToElm(name, type, converter, value) | |
{ | |
try | |
{ | |
return converter(value); | |
} | |
catch(e) | |
{ | |
throw new Error( | |
'Port Error:\n' + | |
'Regarding the port named \'' + name + '\' with type:\n\n' + | |
' ' + type.split('\n').join('\n ') + '\n\n' + | |
'You just sent the value:\n\n' + | |
' ' + JSON.stringify(value) + '\n\n' + | |
'but it cannot be converted to the necessary type.\n' + | |
e.message | |
); | |
} | |
} | |
// OUTBOUND | |
function outbound(name, converter, elmValue) | |
{ | |
localRuntime.ports[name] = converter(elmValue); | |
} | |
function outboundSignal(name, converter, signal) | |
{ | |
var subscribers = []; | |
function subscribe(handler) | |
{ | |
subscribers.push(handler); | |
} | |
function unsubscribe(handler) | |
{ | |
subscribers.pop(subscribers.indexOf(handler)); | |
} | |
function notify(elmValue) | |
{ | |
var jsValue = converter(elmValue); | |
var len = subscribers.length; | |
for (var i = 0; i < len; ++i) | |
{ | |
subscribers[i](jsValue); | |
} | |
} | |
if (!NS) | |
{ | |
NS = Elm.Native.Signal.make(localRuntime); | |
} | |
NS.output('outbound-port-' + name, notify, signal); | |
localRuntime.ports[name] = { | |
subscribe: subscribe, | |
unsubscribe: unsubscribe | |
}; | |
return signal; | |
} | |
return localRuntime.Native.Port.values = { | |
inbound: inbound, | |
outbound: outbound, | |
inboundSignal: inboundSignal, | |
outboundSignal: outboundSignal | |
}; | |
}; | |
if (!Elm.fullscreen) { | |
(function() { | |
'use strict'; | |
var Display = { | |
FULLSCREEN: 0, | |
COMPONENT: 1, | |
NONE: 2 | |
}; | |
Elm.fullscreen = function(module, args) | |
{ | |
var container = document.createElement('div'); | |
document.body.appendChild(container); | |
return init(Display.FULLSCREEN, container, module, args || {}); | |
}; | |
Elm.embed = function(module, container, args) | |
{ | |
var tag = container.tagName; | |
if (tag !== 'DIV') | |
{ | |
throw new Error('Elm.node must be given a DIV, not a ' + tag + '.'); | |
} | |
return init(Display.COMPONENT, container, module, args || {}); | |
}; | |
Elm.worker = function(module, args) | |
{ | |
return init(Display.NONE, {}, module, args || {}); | |
}; | |
function init(display, container, module, args, moduleToReplace) | |
{ | |
// defining state needed for an instance of the Elm RTS | |
var inputs = []; | |
/* OFFSET | |
* Elm's time traveling debugger lets you pause time. This means | |
* "now" may be shifted a bit into the past. By wrapping Date.now() | |
* we can manage this. | |
*/ | |
var timer = { | |
programStart: Date.now(), | |
now: function() | |
{ | |
return Date.now(); | |
} | |
}; | |
var updateInProgress = false; | |
function notify(id, v) | |
{ | |
if (updateInProgress) | |
{ | |
throw new Error( | |
'The notify function has been called synchronously!\n' + | |
'This can lead to frames being dropped.\n' + | |
'Definitely report this to <https://github.com/elm-lang/Elm/issues>\n'); | |
} | |
updateInProgress = true; | |
var timestep = timer.now(); | |
for (var i = inputs.length; i--; ) | |
{ | |
inputs[i].notify(timestep, id, v); | |
} | |
updateInProgress = false; | |
} | |
function setTimeout(func, delay) | |
{ | |
return window.setTimeout(func, delay); | |
} | |
var listeners = []; | |
function addListener(relevantInputs, domNode, eventName, func) | |
{ | |
domNode.addEventListener(eventName, func); | |
var listener = { | |
relevantInputs: relevantInputs, | |
domNode: domNode, | |
eventName: eventName, | |
func: func | |
}; | |
listeners.push(listener); | |
} | |
var argsTracker = {}; | |
for (var name in args) | |
{ | |
argsTracker[name] = { | |
value: args[name], | |
used: false | |
}; | |
} | |
// create the actual RTS. Any impure modules will attach themselves to this | |
// object. This permits many Elm programs to be embedded per document. | |
var elm = { | |
notify: notify, | |
setTimeout: setTimeout, | |
node: container, | |
addListener: addListener, | |
inputs: inputs, | |
timer: timer, | |
argsTracker: argsTracker, | |
ports: {}, | |
isFullscreen: function() { return display === Display.FULLSCREEN; }, | |
isEmbed: function() { return display === Display.COMPONENT; }, | |
isWorker: function() { return display === Display.NONE; } | |
}; | |
function swap(newModule) | |
{ | |
removeListeners(listeners); | |
var div = document.createElement('div'); | |
var newElm = init(display, div, newModule, args, elm); | |
inputs = []; | |
return newElm; | |
} | |
function dispose() | |
{ | |
removeListeners(listeners); | |
inputs = []; | |
} | |
var Module = {}; | |
try | |
{ | |
Module = module.make(elm); | |
checkInputs(elm); | |
} | |
catch (error) | |
{ | |
if (typeof container.appendChild === "function") | |
{ | |
container.appendChild(errorNode(error.message)); | |
} | |
else | |
{ | |
console.error(error.message); | |
} | |
throw error; | |
} | |
if (display !== Display.NONE) | |
{ | |
var graphicsNode = initGraphics(elm, Module); | |
} | |
var rootNode = { kids: inputs }; | |
trimDeadNodes(rootNode); | |
inputs = rootNode.kids; | |
filterListeners(inputs, listeners); | |
addReceivers(elm.ports); | |
if (typeof moduleToReplace !== 'undefined') | |
{ | |
hotSwap(moduleToReplace, elm); | |
// rerender scene if graphics are enabled. | |
if (typeof graphicsNode !== 'undefined') | |
{ | |
graphicsNode.notify(0, true, 0); | |
} | |
} | |
return { | |
swap: swap, | |
ports: elm.ports, | |
dispose: dispose | |
}; | |
} | |
function checkInputs(elm) | |
{ | |
var argsTracker = elm.argsTracker; | |
for (var name in argsTracker) | |
{ | |
if (!argsTracker[name].used) | |
{ | |
throw new Error( | |
"Port Error:\nYou provided an argument named '" + name + | |
"' but there is no corresponding port!\n\n" + | |
"Maybe add a port '" + name + "' to your Elm module?\n" + | |
"Maybe remove the '" + name + "' argument from your initialization code in JS?" | |
); | |
} | |
} | |
} | |
function errorNode(message) | |
{ | |
var code = document.createElement('code'); | |
var lines = message.split('\n'); | |
code.appendChild(document.createTextNode(lines[0])); | |
code.appendChild(document.createElement('br')); | |
code.appendChild(document.createElement('br')); | |
for (var i = 1; i < lines.length; ++i) | |
{ | |
code.appendChild(document.createTextNode('\u00A0 \u00A0 ' + lines[i].replace(/ /g, '\u00A0 '))); | |
code.appendChild(document.createElement('br')); | |
} | |
code.appendChild(document.createElement('br')); | |
code.appendChild(document.createTextNode('Open the developer console for more details.')); | |
return code; | |
} | |
//// FILTER SIGNALS //// | |
// TODO: move this code into the signal module and create a function | |
// Signal.initializeGraph that actually instantiates everything. | |
function filterListeners(inputs, listeners) | |
{ | |
loop: | |
for (var i = listeners.length; i--; ) | |
{ | |
var listener = listeners[i]; | |
for (var j = inputs.length; j--; ) | |
{ | |
if (listener.relevantInputs.indexOf(inputs[j].id) >= 0) | |
{ | |
continue loop; | |
} | |
} | |
listener.domNode.removeEventListener(listener.eventName, listener.func); | |
} | |
} | |
function removeListeners(listeners) | |
{ | |
for (var i = listeners.length; i--; ) | |
{ | |
var listener = listeners[i]; | |
listener.domNode.removeEventListener(listener.eventName, listener.func); | |
} | |
} | |
// add receivers for built-in ports if they are defined | |
function addReceivers(ports) | |
{ | |
if ('title' in ports) | |
{ | |
if (typeof ports.title === 'string') | |
{ | |
document.title = ports.title; | |
} | |
else | |
{ | |
ports.title.subscribe(function(v) { document.title = v; }); | |
} | |
} | |
if ('redirect' in ports) | |
{ | |
ports.redirect.subscribe(function(v) { | |
if (v.length > 0) | |
{ | |
window.location = v; | |
} | |
}); | |
} | |
} | |
// returns a boolean representing whether the node is alive or not. | |
function trimDeadNodes(node) | |
{ | |
if (node.isOutput) | |
{ | |
return true; | |
} | |
var liveKids = []; | |
for (var i = node.kids.length; i--; ) | |
{ | |
var kid = node.kids[i]; | |
if (trimDeadNodes(kid)) | |
{ | |
liveKids.push(kid); | |
} | |
} | |
node.kids = liveKids; | |
return liveKids.length > 0; | |
} | |
//// RENDERING //// | |
function initGraphics(elm, Module) | |
{ | |
if (!('main' in Module)) | |
{ | |
throw new Error("'main' is missing! What do I display?!"); | |
} | |
var signalGraph = Module.main; | |
// make sure the signal graph is actually a signal & extract the visual model | |
if (!('notify' in signalGraph)) | |
{ | |
signalGraph = Elm.Signal.make(elm).constant(signalGraph); | |
} | |
var initialScene = signalGraph.value; | |
// Figure out what the render functions should be | |
var render; | |
var update; | |
if (initialScene.ctor === 'Element_elm_builtin') | |
{ | |
var Element = Elm.Native.Graphics.Element.make(elm); | |
render = Element.render; | |
update = Element.updateAndReplace; | |
} | |
else | |
{ | |
var VirtualDom = Elm.Native.VirtualDom.make(elm); | |
render = VirtualDom.render; | |
update = VirtualDom.updateAndReplace; | |
} | |
// Add the initialScene to the DOM | |
var container = elm.node; | |
var node = render(initialScene); | |
while (container.firstChild) | |
{ | |
container.removeChild(container.firstChild); | |
} | |
container.appendChild(node); | |
var _requestAnimationFrame = | |
typeof requestAnimationFrame !== 'undefined' | |
? requestAnimationFrame | |
: function(cb) { setTimeout(cb, 1000 / 60); } | |
; | |
// domUpdate is called whenever the main Signal changes. | |
// | |
// domUpdate and drawCallback implement a small state machine in order | |
// to schedule only 1 draw per animation frame. This enforces that | |
// once draw has been called, it will not be called again until the | |
// next frame. | |
// | |
// drawCallback is scheduled whenever | |
// 1. The state transitions from PENDING_REQUEST to EXTRA_REQUEST, or | |
// 2. The state transitions from NO_REQUEST to PENDING_REQUEST | |
// | |
// Invariants: | |
// 1. In the NO_REQUEST state, there is never a scheduled drawCallback. | |
// 2. In the PENDING_REQUEST and EXTRA_REQUEST states, there is always exactly 1 | |
// scheduled drawCallback. | |
var NO_REQUEST = 0; | |
var PENDING_REQUEST = 1; | |
var EXTRA_REQUEST = 2; | |
var state = NO_REQUEST; | |
var savedScene = initialScene; | |
var scheduledScene = initialScene; | |
function domUpdate(newScene) | |
{ | |
scheduledScene = newScene; | |
switch (state) | |
{ | |
case NO_REQUEST: | |
_requestAnimationFrame(drawCallback); | |
state = PENDING_REQUEST; | |
return; | |
case PENDING_REQUEST: | |
state = PENDING_REQUEST; | |
return; | |
case EXTRA_REQUEST: | |
state = PENDING_REQUEST; | |
return; | |
} | |
} | |
function drawCallback() | |
{ | |
switch (state) | |
{ | |
case NO_REQUEST: | |
// This state should not be possible. How can there be no | |
// request, yet somehow we are actively fulfilling a | |
// request? | |
throw new Error( | |
'Unexpected draw callback.\n' + | |
'Please report this to <https://github.com/elm-lang/core/issues>.' | |
); | |
case PENDING_REQUEST: | |
// At this point, we do not *know* that another frame is | |
// needed, but we make an extra request to rAF just in | |
// case. It's possible to drop a frame if rAF is called | |
// too late, so we just do it preemptively. | |
_requestAnimationFrame(drawCallback); | |
state = EXTRA_REQUEST; | |
// There's also stuff we definitely need to draw. | |
draw(); | |
return; | |
case EXTRA_REQUEST: | |
// Turns out the extra request was not needed, so we will | |
// stop calling rAF. No reason to call it all the time if | |
// no one needs it. | |
state = NO_REQUEST; | |
return; | |
} | |
} | |
function draw() | |
{ | |
update(elm.node.firstChild, savedScene, scheduledScene); | |
if (elm.Native.Window) | |
{ | |
elm.Native.Window.values.resizeIfNeeded(); | |
} | |
savedScene = scheduledScene; | |
} | |
var renderer = Elm.Native.Signal.make(elm).output('main', domUpdate, signalGraph); | |
// must check for resize after 'renderer' is created so | |
// that changes show up. | |
if (elm.Native.Window) | |
{ | |
elm.Native.Window.values.resizeIfNeeded(); | |
} | |
return renderer; | |
} | |
//// HOT SWAPPING //// | |
// Returns boolean indicating if the swap was successful. | |
// Requires that the two signal graphs have exactly the same | |
// structure. | |
function hotSwap(from, to) | |
{ | |
function similar(nodeOld, nodeNew) | |
{ | |
if (nodeOld.id !== nodeNew.id) | |
{ | |
return false; | |
} | |
if (nodeOld.isOutput) | |
{ | |
return nodeNew.isOutput; | |
} | |
return nodeOld.kids.length === nodeNew.kids.length; | |
} | |
function swap(nodeOld, nodeNew) | |
{ | |
nodeNew.value = nodeOld.value; | |
return true; | |
} | |
var canSwap = depthFirstTraversals(similar, from.inputs, to.inputs); | |
if (canSwap) | |
{ | |
depthFirstTraversals(swap, from.inputs, to.inputs); | |
} | |
from.node.parentNode.replaceChild(to.node, from.node); | |
return canSwap; | |
} | |
// Returns false if the node operation f ever fails. | |
function depthFirstTraversals(f, queueOld, queueNew) | |
{ | |
if (queueOld.length !== queueNew.length) | |
{ | |
return false; | |
} | |
queueOld = queueOld.slice(0); | |
queueNew = queueNew.slice(0); | |
var seen = []; | |
while (queueOld.length > 0 && queueNew.length > 0) | |
{ | |
var nodeOld = queueOld.pop(); | |
var nodeNew = queueNew.pop(); | |
if (seen.indexOf(nodeOld.id) < 0) | |
{ | |
if (!f(nodeOld, nodeNew)) | |
{ | |
return false; | |
} | |
queueOld = queueOld.concat(nodeOld.kids || []); | |
queueNew = queueNew.concat(nodeNew.kids || []); | |
seen.push(nodeOld.id); | |
} | |
} | |
return true; | |
} | |
}()); | |
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); | |
} | |
} | |
Elm.Native = Elm.Native || {}; | |
Elm.Native.Utils = {}; | |
Elm.Native.Utils.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Utils = localRuntime.Native.Utils || {}; | |
if (localRuntime.Native.Utils.values) | |
{ | |
return localRuntime.Native.Utils.values; | |
} | |
// COMPARISONS | |
function eq(l, r) | |
{ | |
var stack = [{'x': l, 'y': r}]; | |
while (stack.length > 0) | |
{ | |
var front = stack.pop(); | |
var x = front.x; | |
var y = front.y; | |
if (x === y) | |
{ | |
continue; | |
} | |
if (typeof x === 'object') | |
{ | |
var c = 0; | |
for (var i in x) | |
{ | |
++c; | |
if (i in y) | |
{ | |
if (i !== 'ctor') | |
{ | |
stack.push({ 'x': x[i], 'y': y[i] }); | |
} | |
} | |
else | |
{ | |
return false; | |
} | |
} | |
if ('ctor' in x) | |
{ | |
stack.push({'x': x.ctor, 'y': y.ctor}); | |
} | |
if (c !== Object.keys(y).length) | |
{ | |
return false; | |
} | |
} | |
else if (typeof x === 'function') | |
{ | |
throw new Error('Equality error: general function equality is ' + | |
'undecidable, and therefore, unsupported'); | |
} | |
else | |
{ | |
return false; | |
} | |
} | |
return true; | |
} | |
// code in Generate/JavaScript.hs depends on the particular | |
// integer values assigned to LT, EQ, and GT | |
var LT = -1, EQ = 0, GT = 1, ord = ['LT', 'EQ', 'GT']; | |
function compare(x, y) | |
{ | |
return { | |
ctor: ord[cmp(x, y) + 1] | |
}; | |
} | |
function cmp(x, y) { | |
var ord; | |
if (typeof x !== 'object') | |
{ | |
return x === y ? EQ : x < y ? LT : GT; | |
} | |
else if (x.isChar) | |
{ | |
var a = x.toString(); | |
var b = y.toString(); | |
return a === b | |
? EQ | |
: a < b | |
? LT | |
: GT; | |
} | |
else if (x.ctor === '::' || x.ctor === '[]') | |
{ | |
while (true) | |
{ | |
if (x.ctor === '[]' && y.ctor === '[]') | |
{ | |
return EQ; | |
} | |
if (x.ctor !== y.ctor) | |
{ | |
return x.ctor === '[]' ? LT : GT; | |
} | |
ord = cmp(x._0, y._0); | |
if (ord !== EQ) | |
{ | |
return ord; | |
} | |
x = x._1; | |
y = y._1; | |
} | |
} | |
else if (x.ctor.slice(0, 6) === '_Tuple') | |
{ | |
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; | |
} | |
else | |
{ | |
throw new Error('Comparison error: comparison is only defined on ints, ' + | |
'floats, times, chars, strings, lists of comparable values, ' + | |
'and tuples of comparable values.'); | |
} | |
} | |
// TUPLES | |
var Tuple0 = { | |
ctor: '_Tuple0' | |
}; | |
function Tuple2(x, y) | |
{ | |
return { | |
ctor: '_Tuple2', | |
_0: x, | |
_1: y | |
}; | |
} | |
// LITERALS | |
function chr(c) | |
{ | |
var x = new String(c); | |
x.isChar = true; | |
return x; | |
} | |
function txt(str) | |
{ | |
var t = new String(str); | |
t.text = true; | |
return t; | |
} | |
// 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; | |
} | |
// MOUSE COORDINATES | |
function getXY(e) | |
{ | |
var posx = 0; | |
var posy = 0; | |
if (e.pageX || e.pageY) | |
{ | |
posx = e.pageX; | |
posy = e.pageY; | |
} | |
else if (e.clientX || e.clientY) | |
{ | |
posx = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft; | |
posy = e.clientY + document.body.scrollTop + document.documentElement.scrollTop; | |
} | |
if (localRuntime.isEmbed()) | |
{ | |
var rect = localRuntime.node.getBoundingClientRect(); | |
var relx = rect.left + document.body.scrollLeft + document.documentElement.scrollLeft; | |
var rely = rect.top + document.body.scrollTop + document.documentElement.scrollTop; | |
// TODO: figure out if there is a way to avoid rounding here | |
posx = posx - Math.round(relx) - localRuntime.node.clientLeft; | |
posy = posy - Math.round(rely) - localRuntime.node.clientTop; | |
} | |
return Tuple2(posx, posy); | |
} | |
//// LIST STUFF //// | |
var Nil = { ctor: '[]' }; | |
function Cons(hd, tl) | |
{ | |
return { | |
ctor: '::', | |
_0: hd, | |
_1: tl | |
}; | |
} | |
function list(arr) | |
{ | |
var out = Nil; | |
for (var i = arr.length; i--; ) | |
{ | |
out = Cons(arr[i], out); | |
} | |
return out; | |
} | |
function range(lo, hi) | |
{ | |
var list = Nil; | |
if (lo <= hi) | |
{ | |
do | |
{ | |
list = Cons(hi, list); | |
} | |
while (hi-- > lo); | |
} | |
return list; | |
} | |
function append(xs, ys) | |
{ | |
// append Strings | |
if (typeof xs === 'string') | |
{ | |
return xs + ys; | |
} | |
// append Text | |
if (xs.ctor.slice(0, 5) === 'Text:') | |
{ | |
return { | |
ctor: 'Text:Append', | |
_0: xs, | |
_1: 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; | |
} | |
// BAD PORTS | |
function badPort(expected, received) | |
{ | |
throw new Error( | |
'Runtime error when sending values through a port.\n\n' | |
+ 'Expecting ' + expected + ' but was given ' + formatValue(received) | |
); | |
} | |
function formatValue(value) | |
{ | |
// Explicity format undefined values as "undefined" | |
// because JSON.stringify(undefined) unhelpfully returns "" | |
return (value === undefined) ? "undefined" : JSON.stringify(value); | |
} | |
// TO STRING | |
var _Array; | |
var Dict; | |
var List; | |
var toString = function(v) | |
{ | |
var type = typeof v; | |
if (type === 'function') | |
{ | |
var name = v.func ? v.func.name : v.name; | |
return '<function' + (name === '' ? '' : ': ') + name + '>'; | |
} | |
else if (type === 'boolean') | |
{ | |
return v ? 'True' : 'False'; | |
} | |
else if (type === 'number') | |
{ | |
return v + ''; | |
} | |
else if ((v instanceof String) && v.isChar) | |
{ | |
return '\'' + addSlashes(v, true) + '\''; | |
} | |
else if (type === 'string') | |
{ | |
return '"' + addSlashes(v, false) + '"'; | |
} | |
else if (type === 'object' && 'ctor' in v) | |
{ | |
if (v.ctor.substring(0, 6) === '_Tuple') | |
{ | |
var output = []; | |
for (var k in v) | |
{ | |
if (k === 'ctor') continue; | |
output.push(toString(v[k])); | |
} | |
return '(' + output.join(',') + ')'; | |
} | |
else if (v.ctor === '_Array') | |
{ | |
if (!_Array) | |
{ | |
_Array = Elm.Array.make(localRuntime); | |
} | |
var list = _Array.toList(v); | |
return 'Array.fromList ' + toString(list); | |
} | |
else if (v.ctor === '::') | |
{ | |
var output = '[' + toString(v._0); | |
v = v._1; | |
while (v.ctor === '::') | |
{ | |
output += ',' + toString(v._0); | |
v = v._1; | |
} | |
return output + ']'; | |
} | |
else if (v.ctor === '[]') | |
{ | |
return '[]'; | |
} | |
else if (v.ctor === 'RBNode_elm_builtin' || v.ctor === 'RBEmpty_elm_builtin' || v.ctor === 'Set_elm_builtin') | |
{ | |
if (!Dict) | |
{ | |
Dict = Elm.Dict.make(localRuntime); | |
} | |
var list; | |
var name; | |
if (v.ctor === 'Set_elm_builtin') | |
{ | |
if (!List) | |
{ | |
List = Elm.List.make(localRuntime); | |
} | |
name = 'Set'; | |
list = A2(List.map, function(x) {return x._0; }, Dict.toList(v._0)); | |
} | |
else | |
{ | |
name = 'Dict'; | |
list = Dict.toList(v); | |
} | |
return name + '.fromList ' + toString(list); | |
} | |
else if (v.ctor.slice(0, 5) === 'Text:') | |
{ | |
return '<text>'; | |
} | |
else if (v.ctor === 'Element_elm_builtin') | |
{ | |
return '<element>' | |
} | |
else if (v.ctor === 'Form_elm_builtin') | |
{ | |
return '<form>' | |
} | |
else | |
{ | |
var output = ''; | |
for (var i in v) | |
{ | |
if (i === 'ctor') continue; | |
var str = toString(v[i]); | |
var parenless = str[0] === '{' || str[0] === '<' || str.indexOf(' ') < 0; | |
output += ' ' + (parenless ? str : '(' + str + ')'); | |
} | |
return v.ctor + output; | |
} | |
} | |
else if (type === 'object' && 'notify' in v && 'id' in v) | |
{ | |
return '<signal>'; | |
} | |
else if (type === 'object') | |
{ | |
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 localRuntime.Native.Utils.values = { | |
eq: eq, | |
cmp: cmp, | |
compare: F2(compare), | |
Tuple0: Tuple0, | |
Tuple2: Tuple2, | |
chr: chr, | |
txt: txt, | |
update: update, | |
guid: guid, | |
getXY: getXY, | |
Nil: Nil, | |
Cons: Cons, | |
list: list, | |
range: range, | |
append: F2(append), | |
crash: crash, | |
crashCase: crashCase, | |
badPort: badPort, | |
toString: toString | |
}; | |
}; | |
Elm.Basics = Elm.Basics || {}; | |
Elm.Basics.make = function (_elm) { | |
"use strict"; | |
_elm.Basics = _elm.Basics || {}; | |
if (_elm.Basics.values) return _elm.Basics.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Native$Basics = Elm.Native.Basics.make(_elm), | |
$Native$Utils = Elm.Native.Utils.make(_elm); | |
var _op = {}; | |
var uncurry = F2(function (f,_p0) { | |
var _p1 = _p0; | |
return A2(f,_p1._0,_p1._1); | |
}); | |
var curry = F3(function (f,a,b) { | |
return f({ctor: "_Tuple2",_0: a,_1: b}); | |
}); | |
var flip = F3(function (f,b,a) { return A2(f,a,b);}); | |
var snd = function (_p2) { var _p3 = _p2;return _p3._1;}; | |
var fst = function (_p4) { var _p5 = _p4;return _p5._0;}; | |
var always = F2(function (a,_p6) { return a;}); | |
var identity = function (x) { return x;}; | |
_op["<|"] = F2(function (f,x) { return f(x);}); | |
_op["|>"] = F2(function (x,f) { return f(x);}); | |
_op[">>"] = F3(function (f,g,x) { return g(f(x));}); | |
_op["<<"] = F3(function (g,f,x) { return g(f(x));}); | |
_op["++"] = $Native$Utils.append; | |
var toString = $Native$Utils.toString; | |
var isInfinite = $Native$Basics.isInfinite; | |
var isNaN = $Native$Basics.isNaN; | |
var toFloat = $Native$Basics.toFloat; | |
var ceiling = $Native$Basics.ceiling; | |
var floor = $Native$Basics.floor; | |
var truncate = $Native$Basics.truncate; | |
var round = $Native$Basics.round; | |
var not = $Native$Basics.not; | |
var xor = $Native$Basics.xor; | |
_op["||"] = $Native$Basics.or; | |
_op["&&"] = $Native$Basics.and; | |
var max = $Native$Basics.max; | |
var min = $Native$Basics.min; | |
var GT = {ctor: "GT"}; | |
var EQ = {ctor: "EQ"}; | |
var LT = {ctor: "LT"}; | |
var compare = $Native$Basics.compare; | |
_op[">="] = $Native$Basics.ge; | |
_op["<="] = $Native$Basics.le; | |
_op[">"] = $Native$Basics.gt; | |
_op["<"] = $Native$Basics.lt; | |
_op["/="] = $Native$Basics.neq; | |
_op["=="] = $Native$Basics.eq; | |
var e = $Native$Basics.e; | |
var pi = $Native$Basics.pi; | |
var clamp = $Native$Basics.clamp; | |
var logBase = $Native$Basics.logBase; | |
var abs = $Native$Basics.abs; | |
var negate = $Native$Basics.negate; | |
var sqrt = $Native$Basics.sqrt; | |
var atan2 = $Native$Basics.atan2; | |
var atan = $Native$Basics.atan; | |
var asin = $Native$Basics.asin; | |
var acos = $Native$Basics.acos; | |
var tan = $Native$Basics.tan; | |
var sin = $Native$Basics.sin; | |
var cos = $Native$Basics.cos; | |
_op["^"] = $Native$Basics.exp; | |
_op["%"] = $Native$Basics.mod; | |
var rem = $Native$Basics.rem; | |
_op["//"] = $Native$Basics.div; | |
_op["/"] = $Native$Basics.floatDiv; | |
_op["*"] = $Native$Basics.mul; | |
_op["-"] = $Native$Basics.sub; | |
_op["+"] = $Native$Basics.add; | |
var toPolar = $Native$Basics.toPolar; | |
var fromPolar = $Native$Basics.fromPolar; | |
var turns = $Native$Basics.turns; | |
var degrees = $Native$Basics.degrees; | |
var radians = function (t) { return t;}; | |
return _elm.Basics.values = {_op: _op | |
,max: max | |
,min: min | |
,compare: compare | |
,not: not | |
,xor: xor | |
,rem: rem | |
,negate: negate | |
,abs: abs | |
,sqrt: sqrt | |
,clamp: clamp | |
,logBase: logBase | |
,e: e | |
,pi: pi | |
,cos: cos | |
,sin: sin | |
,tan: tan | |
,acos: acos | |
,asin: asin | |
,atan: atan | |
,atan2: atan2 | |
,round: round | |
,floor: floor | |
,ceiling: ceiling | |
,truncate: truncate | |
,toFloat: toFloat | |
,degrees: degrees | |
,radians: radians | |
,turns: turns | |
,toPolar: toPolar | |
,fromPolar: fromPolar | |
,isNaN: isNaN | |
,isInfinite: isInfinite | |
,toString: toString | |
,fst: fst | |
,snd: snd | |
,identity: identity | |
,always: always | |
,flip: flip | |
,curry: curry | |
,uncurry: uncurry | |
,LT: LT | |
,EQ: EQ | |
,GT: GT}; | |
}; | |
Elm.Maybe = Elm.Maybe || {}; | |
Elm.Maybe.make = function (_elm) { | |
"use strict"; | |
_elm.Maybe = _elm.Maybe || {}; | |
if (_elm.Maybe.values) return _elm.Maybe.values; | |
var _U = Elm.Native.Utils.make(_elm); | |
var _op = {}; | |
var withDefault = F2(function ($default,maybe) { | |
var _p0 = maybe; | |
if (_p0.ctor === "Just") { | |
return _p0._0; | |
} else { | |
return $default; | |
} | |
}); | |
var Nothing = {ctor: "Nothing"}; | |
var oneOf = function (maybes) { | |
oneOf: while (true) { | |
var _p1 = maybes; | |
if (_p1.ctor === "[]") { | |
return 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 andThen = F2(function (maybeValue,callback) { | |
var _p4 = maybeValue; | |
if (_p4.ctor === "Just") { | |
return callback(_p4._0); | |
} else { | |
return Nothing; | |
} | |
}); | |
var Just = function (a) { return {ctor: "Just",_0: a};}; | |
var map = F2(function (f,maybe) { | |
var _p5 = maybe; | |
if (_p5.ctor === "Just") { | |
return Just(f(_p5._0)); | |
} else { | |
return Nothing; | |
} | |
}); | |
var 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 Just(A2(func,_p6._0._0,_p6._1._0)); | |
} else { | |
return Nothing; | |
} | |
}); | |
var 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 Just(A3(func,_p7._0._0,_p7._1._0,_p7._2._0)); | |
} else { | |
return Nothing; | |
} | |
}); | |
var 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 Just(A4(func, | |
_p8._0._0, | |
_p8._1._0, | |
_p8._2._0, | |
_p8._3._0)); | |
} else { | |
return Nothing; | |
} | |
}); | |
var 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 Just(A5(func, | |
_p9._0._0, | |
_p9._1._0, | |
_p9._2._0, | |
_p9._3._0, | |
_p9._4._0)); | |
} else { | |
return Nothing; | |
} | |
}); | |
return _elm.Maybe.values = {_op: _op | |
,andThen: andThen | |
,map: map | |
,map2: map2 | |
,map3: map3 | |
,map4: map4 | |
,map5: map5 | |
,withDefault: withDefault | |
,oneOf: oneOf | |
,Just: Just | |
,Nothing: Nothing}; | |
}; | |
Elm.Native.List = {}; | |
Elm.Native.List.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.List = localRuntime.Native.List || {}; | |
if (localRuntime.Native.List.values) | |
{ | |
return localRuntime.Native.List.values; | |
} | |
if ('values' in Elm.Native.List) | |
{ | |
return localRuntime.Native.List.values = Elm.Native.List.values; | |
} | |
var Utils = Elm.Native.Utils.make(localRuntime); | |
var Nil = Utils.Nil; | |
var Cons = Utils.Cons; | |
var fromArray = Utils.list; | |
function toArray(xs) | |
{ | |
var out = []; | |
while (xs.ctor !== '[]') | |
{ | |
out.push(xs._0); | |
xs = xs._1; | |
} | |
return out; | |
} | |
// f defined similarly for both foldl and foldr (NB: different from Haskell) | |
// ie, foldl : (a -> b -> b) -> b -> [a] -> b | |
function foldl(f, b, xs) | |
{ | |
var acc = b; | |
while (xs.ctor !== '[]') | |
{ | |
acc = A2(f, xs._0, acc); | |
xs = xs._1; | |
} | |
return acc; | |
} | |
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 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; | |
})); | |
} | |
function take(n, xs) | |
{ | |
var arr = []; | |
while (xs.ctor !== '[]' && n > 0) | |
{ | |
arr.push(xs._0); | |
xs = xs._1; | |
--n; | |
} | |
return fromArray(arr); | |
} | |
Elm.Native.List.values = { | |
Nil: Nil, | |
Cons: Cons, | |
cons: F2(Cons), | |
toArray: toArray, | |
fromArray: fromArray, | |
foldl: F3(foldl), | |
foldr: F3(foldr), | |
map2: F3(map2), | |
map3: F4(map3), | |
map4: F5(map4), | |
map5: F6(map5), | |
sortBy: F2(sortBy), | |
sortWith: F2(sortWith), | |
take: F2(take) | |
}; | |
return localRuntime.Native.List.values = Elm.Native.List.values; | |
}; | |
Elm.List = Elm.List || {}; | |
Elm.List.make = function (_elm) { | |
"use strict"; | |
_elm.List = _elm.List || {}; | |
if (_elm.List.values) return _elm.List.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Native$List = Elm.Native.List.make(_elm); | |
var _op = {}; | |
var sortWith = $Native$List.sortWith; | |
var sortBy = $Native$List.sortBy; | |
var sort = function (xs) { | |
return A2(sortBy,$Basics.identity,xs); | |
}; | |
var drop = F2(function (n,list) { | |
drop: while (true) if (_U.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 take = $Native$List.take; | |
var map5 = $Native$List.map5; | |
var map4 = $Native$List.map4; | |
var map3 = $Native$List.map3; | |
var map2 = $Native$List.map2; | |
var 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 all = F2(function (isOkay,list) { | |
return $Basics.not(A2(any, | |
function (_p2) { | |
return $Basics.not(isOkay(_p2)); | |
}, | |
list)); | |
}); | |
var foldr = $Native$List.foldr; | |
var foldl = $Native$List.foldl; | |
var length = function (xs) { | |
return A3(foldl, | |
F2(function (_p3,i) { return i + 1;}), | |
0, | |
xs); | |
}; | |
var sum = function (numbers) { | |
return A3(foldl, | |
F2(function (x,y) { return x + y;}), | |
0, | |
numbers); | |
}; | |
var product = function (numbers) { | |
return A3(foldl, | |
F2(function (x,y) { return x * y;}), | |
1, | |
numbers); | |
}; | |
var maximum = function (list) { | |
var _p4 = list; | |
if (_p4.ctor === "::") { | |
return $Maybe.Just(A3(foldl,$Basics.max,_p4._0,_p4._1)); | |
} else { | |
return $Maybe.Nothing; | |
} | |
}; | |
var minimum = function (list) { | |
var _p5 = list; | |
if (_p5.ctor === "::") { | |
return $Maybe.Just(A3(foldl,$Basics.min,_p5._0,_p5._1)); | |
} else { | |
return $Maybe.Nothing; | |
} | |
}; | |
var indexedMap = F2(function (f,xs) { | |
return A3(map2,f,_U.range(0,length(xs) - 1),xs); | |
}); | |
var member = F2(function (x,xs) { | |
return A2(any,function (a) { return _U.eq(a,x);},xs); | |
}); | |
var isEmpty = function (xs) { | |
var _p6 = xs; | |
if (_p6.ctor === "[]") { | |
return true; | |
} else { | |
return false; | |
} | |
}; | |
var tail = function (list) { | |
var _p7 = list; | |
if (_p7.ctor === "::") { | |
return $Maybe.Just(_p7._1); | |
} else { | |
return $Maybe.Nothing; | |
} | |
}; | |
var head = function (list) { | |
var _p8 = list; | |
if (_p8.ctor === "::") { | |
return $Maybe.Just(_p8._0); | |
} else { | |
return $Maybe.Nothing; | |
} | |
}; | |
_op["::"] = $Native$List.cons; | |
var map = F2(function (f,xs) { | |
return A3(foldr, | |
F2(function (x,acc) { return A2(_op["::"],f(x),acc);}), | |
_U.list([]), | |
xs); | |
}); | |
var filter = F2(function (pred,xs) { | |
var conditionalCons = F2(function (x,xs$) { | |
return pred(x) ? A2(_op["::"],x,xs$) : xs$; | |
}); | |
return A3(foldr,conditionalCons,_U.list([]),xs); | |
}); | |
var maybeCons = F3(function (f,mx,xs) { | |
var _p9 = f(mx); | |
if (_p9.ctor === "Just") { | |
return A2(_op["::"],_p9._0,xs); | |
} else { | |
return xs; | |
} | |
}); | |
var filterMap = F2(function (f,xs) { | |
return A3(foldr,maybeCons(f),_U.list([]),xs); | |
}); | |
var reverse = function (list) { | |
return A3(foldl, | |
F2(function (x,y) { return A2(_op["::"],x,y);}), | |
_U.list([]), | |
list); | |
}; | |
var scanl = F3(function (f,b,xs) { | |
var scan1 = F2(function (x,accAcc) { | |
var _p10 = accAcc; | |
if (_p10.ctor === "::") { | |
return A2(_op["::"],A2(f,x,_p10._0),accAcc); | |
} else { | |
return _U.list([]); | |
} | |
}); | |
return reverse(A3(foldl,scan1,_U.list([b]),xs)); | |
}); | |
var append = F2(function (xs,ys) { | |
var _p11 = ys; | |
if (_p11.ctor === "[]") { | |
return xs; | |
} else { | |
return A3(foldr, | |
F2(function (x,y) { return A2(_op["::"],x,y);}), | |
ys, | |
xs); | |
} | |
}); | |
var concat = function (lists) { | |
return A3(foldr,append,_U.list([]),lists); | |
}; | |
var concatMap = F2(function (f,list) { | |
return concat(A2(map,f,list)); | |
}); | |
var partition = F2(function (pred,list) { | |
var step = F2(function (x,_p12) { | |
var _p13 = _p12; | |
var _p15 = _p13._0; | |
var _p14 = _p13._1; | |
return pred(x) ? {ctor: "_Tuple2" | |
,_0: A2(_op["::"],x,_p15) | |
,_1: _p14} : {ctor: "_Tuple2" | |
,_0: _p15 | |
,_1: A2(_op["::"],x,_p14)}; | |
}); | |
return A3(foldr, | |
step, | |
{ctor: "_Tuple2",_0: _U.list([]),_1: _U.list([])}, | |
list); | |
}); | |
var unzip = function (pairs) { | |
var step = F2(function (_p17,_p16) { | |
var _p18 = _p17; | |
var _p19 = _p16; | |
return {ctor: "_Tuple2" | |
,_0: A2(_op["::"],_p18._0,_p19._0) | |
,_1: A2(_op["::"],_p18._1,_p19._1)}; | |
}); | |
return A3(foldr, | |
step, | |
{ctor: "_Tuple2",_0: _U.list([]),_1: _U.list([])}, | |
pairs); | |
}; | |
var intersperse = F2(function (sep,xs) { | |
var _p20 = xs; | |
if (_p20.ctor === "[]") { | |
return _U.list([]); | |
} else { | |
var step = F2(function (x,rest) { | |
return A2(_op["::"],sep,A2(_op["::"],x,rest)); | |
}); | |
var spersed = A3(foldr,step,_U.list([]),_p20._1); | |
return A2(_op["::"],_p20._0,spersed); | |
} | |
}); | |
var repeatHelp = F3(function (result,n,value) { | |
repeatHelp: while (true) if (_U.cmp(n,0) < 1) return result; | |
else { | |
var _v18 = A2(_op["::"],value,result), | |
_v19 = n - 1, | |
_v20 = value; | |
result = _v18; | |
n = _v19; | |
value = _v20; | |
continue repeatHelp; | |
} | |
}); | |
var repeat = F2(function (n,value) { | |
return A3(repeatHelp,_U.list([]),n,value); | |
}); | |
return _elm.List.values = {_op: _op | |
,isEmpty: isEmpty | |
,length: length | |
,reverse: reverse | |
,member: member | |
,head: head | |
,tail: tail | |
,filter: filter | |
,take: take | |
,drop: drop | |
,repeat: repeat | |
,append: append | |
,concat: concat | |
,intersperse: intersperse | |
,partition: partition | |
,unzip: unzip | |
,map: map | |
,map2: map2 | |
,map3: map3 | |
,map4: map4 | |
,map5: map5 | |
,filterMap: filterMap | |
,concatMap: concatMap | |
,indexedMap: indexedMap | |
,foldr: foldr | |
,foldl: foldl | |
,sum: sum | |
,product: product | |
,maximum: maximum | |
,minimum: minimum | |
,all: all | |
,any: any | |
,scanl: scanl | |
,sort: sort | |
,sortBy: sortBy | |
,sortWith: sortWith}; | |
}; | |
Elm.Array = Elm.Array || {}; | |
Elm.Array.make = function (_elm) { | |
"use strict"; | |
_elm.Array = _elm.Array || {}; | |
if (_elm.Array.values) return _elm.Array.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Native$Array = Elm.Native.Array.make(_elm); | |
var _op = {}; | |
var append = $Native$Array.append; | |
var length = $Native$Array.length; | |
var isEmpty = function (array) { | |
return _U.eq(length(array),0); | |
}; | |
var slice = $Native$Array.slice; | |
var set = $Native$Array.set; | |
var get = F2(function (i,array) { | |
return _U.cmp(0,i) < 1 && _U.cmp(i, | |
$Native$Array.length(array)) < 0 ? $Maybe.Just(A2($Native$Array.get, | |
i, | |
array)) : $Maybe.Nothing; | |
}); | |
var push = $Native$Array.push; | |
var empty = $Native$Array.empty; | |
var filter = F2(function (isOkay,arr) { | |
var update = F2(function (x,xs) { | |
return isOkay(x) ? A2($Native$Array.push,x,xs) : xs; | |
}); | |
return A3($Native$Array.foldl,update,$Native$Array.empty,arr); | |
}); | |
var foldr = $Native$Array.foldr; | |
var foldl = $Native$Array.foldl; | |
var indexedMap = $Native$Array.indexedMap; | |
var map = $Native$Array.map; | |
var toIndexedList = function (array) { | |
return A3($List.map2, | |
F2(function (v0,v1) { | |
return {ctor: "_Tuple2",_0: v0,_1: v1}; | |
}), | |
_U.range(0,$Native$Array.length(array) - 1), | |
$Native$Array.toList(array)); | |
}; | |
var toList = $Native$Array.toList; | |
var fromList = $Native$Array.fromList; | |
var initialize = $Native$Array.initialize; | |
var repeat = F2(function (n,e) { | |
return A2(initialize,n,$Basics.always(e)); | |
}); | |
var Array = {ctor: "Array"}; | |
return _elm.Array.values = {_op: _op | |
,empty: empty | |
,repeat: repeat | |
,initialize: initialize | |
,fromList: fromList | |
,isEmpty: isEmpty | |
,length: length | |
,push: push | |
,append: append | |
,get: get | |
,set: set | |
,slice: slice | |
,toList: toList | |
,toIndexedList: toIndexedList | |
,map: map | |
,indexedMap: indexedMap | |
,filter: filter | |
,foldl: foldl | |
,foldr: foldr}; | |
}; | |
Elm.Native.Char = {}; | |
Elm.Native.Char.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Char = localRuntime.Native.Char || {}; | |
if (localRuntime.Native.Char.values) | |
{ | |
return localRuntime.Native.Char.values; | |
} | |
var Utils = Elm.Native.Utils.make(localRuntime); | |
return localRuntime.Native.Char.values = { | |
fromCode: function(c) { return Utils.chr(String.fromCharCode(c)); }, | |
toCode: function(c) { return c.charCodeAt(0); }, | |
toUpper: function(c) { return Utils.chr(c.toUpperCase()); }, | |
toLower: function(c) { return Utils.chr(c.toLowerCase()); }, | |
toLocaleUpper: function(c) { return Utils.chr(c.toLocaleUpperCase()); }, | |
toLocaleLower: function(c) { return Utils.chr(c.toLocaleLowerCase()); } | |
}; | |
}; | |
Elm.Char = Elm.Char || {}; | |
Elm.Char.make = function (_elm) { | |
"use strict"; | |
_elm.Char = _elm.Char || {}; | |
if (_elm.Char.values) return _elm.Char.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Native$Char = Elm.Native.Char.make(_elm); | |
var _op = {}; | |
var fromCode = $Native$Char.fromCode; | |
var toCode = $Native$Char.toCode; | |
var toLocaleLower = $Native$Char.toLocaleLower; | |
var toLocaleUpper = $Native$Char.toLocaleUpper; | |
var toLower = $Native$Char.toLower; | |
var toUpper = $Native$Char.toUpper; | |
var isBetween = F3(function (low,high,$char) { | |
var code = toCode($char); | |
return _U.cmp(code,toCode(low)) > -1 && _U.cmp(code, | |
toCode(high)) < 1; | |
}); | |
var isUpper = A2(isBetween,_U.chr("A"),_U.chr("Z")); | |
var isLower = A2(isBetween,_U.chr("a"),_U.chr("z")); | |
var isDigit = A2(isBetween,_U.chr("0"),_U.chr("9")); | |
var isOctDigit = A2(isBetween,_U.chr("0"),_U.chr("7")); | |
var isHexDigit = function ($char) { | |
return isDigit($char) || (A3(isBetween, | |
_U.chr("a"), | |
_U.chr("f"), | |
$char) || A3(isBetween,_U.chr("A"),_U.chr("F"),$char)); | |
}; | |
return _elm.Char.values = {_op: _op | |
,isUpper: isUpper | |
,isLower: isLower | |
,isDigit: isDigit | |
,isOctDigit: isOctDigit | |
,isHexDigit: isHexDigit | |
,toUpper: toUpper | |
,toLower: toLower | |
,toLocaleUpper: toLocaleUpper | |
,toLocaleLower: toLocaleLower | |
,toCode: toCode | |
,fromCode: fromCode}; | |
}; | |
Elm.Native.Color = {}; | |
Elm.Native.Color.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Color = localRuntime.Native.Color || {}; | |
if (localRuntime.Native.Color.values) | |
{ | |
return localRuntime.Native.Color.values; | |
} | |
function toCss(c) | |
{ | |
var format = ''; | |
var colors = ''; | |
if (c.ctor === 'RGBA') | |
{ | |
format = 'rgb'; | |
colors = c._0 + ', ' + c._1 + ', ' + c._2; | |
} | |
else | |
{ | |
format = 'hsl'; | |
colors = (c._0 * 180 / Math.PI) + ', ' + | |
(c._1 * 100) + '%, ' + | |
(c._2 * 100) + '%'; | |
} | |
if (c._3 === 1) | |
{ | |
return format + '(' + colors + ')'; | |
} | |
else | |
{ | |
return format + 'a(' + colors + ', ' + c._3 + ')'; | |
} | |
} | |
return localRuntime.Native.Color.values = { | |
toCss: toCss | |
}; | |
}; | |
Elm.Color = Elm.Color || {}; | |
Elm.Color.make = function (_elm) { | |
"use strict"; | |
_elm.Color = _elm.Color || {}; | |
if (_elm.Color.values) return _elm.Color.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm); | |
var _op = {}; | |
var Radial = F5(function (a,b,c,d,e) { | |
return {ctor: "Radial",_0: a,_1: b,_2: c,_3: d,_4: e}; | |
}); | |
var radial = Radial; | |
var Linear = F3(function (a,b,c) { | |
return {ctor: "Linear",_0: a,_1: b,_2: c}; | |
}); | |
var linear = Linear; | |
var fmod = F2(function (f,n) { | |
var integer = $Basics.floor(f); | |
return $Basics.toFloat(A2($Basics._op["%"], | |
integer, | |
n)) + f - $Basics.toFloat(integer); | |
}); | |
var rgbToHsl = F3(function (red,green,blue) { | |
var b = $Basics.toFloat(blue) / 255; | |
var g = $Basics.toFloat(green) / 255; | |
var r = $Basics.toFloat(red) / 255; | |
var cMax = A2($Basics.max,A2($Basics.max,r,g),b); | |
var cMin = A2($Basics.min,A2($Basics.min,r,g),b); | |
var c = cMax - cMin; | |
var lightness = (cMax + cMin) / 2; | |
var saturation = _U.eq(lightness, | |
0) ? 0 : c / (1 - $Basics.abs(2 * lightness - 1)); | |
var hue = $Basics.degrees(60) * (_U.eq(cMax,r) ? A2(fmod, | |
(g - b) / c, | |
6) : _U.eq(cMax,g) ? (b - r) / c + 2 : (r - g) / c + 4); | |
return {ctor: "_Tuple3",_0: hue,_1: saturation,_2: lightness}; | |
}); | |
var hslToRgb = F3(function (hue,saturation,lightness) { | |
var hue$ = hue / $Basics.degrees(60); | |
var chroma = (1 - $Basics.abs(2 * lightness - 1)) * saturation; | |
var x = chroma * (1 - $Basics.abs(A2(fmod,hue$,2) - 1)); | |
var _p0 = _U.cmp(hue$,0) < 0 ? {ctor: "_Tuple3" | |
,_0: 0 | |
,_1: 0 | |
,_2: 0} : _U.cmp(hue$,1) < 0 ? {ctor: "_Tuple3" | |
,_0: chroma | |
,_1: x | |
,_2: 0} : _U.cmp(hue$,2) < 0 ? {ctor: "_Tuple3" | |
,_0: x | |
,_1: chroma | |
,_2: 0} : _U.cmp(hue$,3) < 0 ? {ctor: "_Tuple3" | |
,_0: 0 | |
,_1: chroma | |
,_2: x} : _U.cmp(hue$, | |
4) < 0 ? {ctor: "_Tuple3",_0: 0,_1: x,_2: chroma} : _U.cmp(hue$, | |
5) < 0 ? {ctor: "_Tuple3",_0: x,_1: 0,_2: chroma} : _U.cmp(hue$, | |
6) < 0 ? {ctor: "_Tuple3" | |
,_0: chroma | |
,_1: 0 | |
,_2: x} : {ctor: "_Tuple3",_0: 0,_1: 0,_2: 0}; | |
var r = _p0._0; | |
var g = _p0._1; | |
var b = _p0._2; | |
var m = lightness - chroma / 2; | |
return {ctor: "_Tuple3",_0: r + m,_1: g + m,_2: b + m}; | |
}); | |
var toRgb = function (color) { | |
var _p1 = color; | |
if (_p1.ctor === "RGBA") { | |
return {red: _p1._0 | |
,green: _p1._1 | |
,blue: _p1._2 | |
,alpha: _p1._3}; | |
} else { | |
var _p2 = A3(hslToRgb,_p1._0,_p1._1,_p1._2); | |
var r = _p2._0; | |
var g = _p2._1; | |
var b = _p2._2; | |
return {red: $Basics.round(255 * r) | |
,green: $Basics.round(255 * g) | |
,blue: $Basics.round(255 * b) | |
,alpha: _p1._3}; | |
} | |
}; | |
var toHsl = function (color) { | |
var _p3 = color; | |
if (_p3.ctor === "HSLA") { | |
return {hue: _p3._0 | |
,saturation: _p3._1 | |
,lightness: _p3._2 | |
,alpha: _p3._3}; | |
} else { | |
var _p4 = A3(rgbToHsl,_p3._0,_p3._1,_p3._2); | |
var h = _p4._0; | |
var s = _p4._1; | |
var l = _p4._2; | |
return {hue: h,saturation: s,lightness: l,alpha: _p3._3}; | |
} | |
}; | |
var HSLA = F4(function (a,b,c,d) { | |
return {ctor: "HSLA",_0: a,_1: b,_2: c,_3: d}; | |
}); | |
var hsla = F4(function (hue,saturation,lightness,alpha) { | |
return A4(HSLA, | |
hue - $Basics.turns($Basics.toFloat($Basics.floor(hue / (2 * $Basics.pi)))), | |
saturation, | |
lightness, | |
alpha); | |
}); | |
var hsl = F3(function (hue,saturation,lightness) { | |
return A4(hsla,hue,saturation,lightness,1); | |
}); | |
var complement = function (color) { | |
var _p5 = color; | |
if (_p5.ctor === "HSLA") { | |
return A4(hsla, | |
_p5._0 + $Basics.degrees(180), | |
_p5._1, | |
_p5._2, | |
_p5._3); | |
} else { | |
var _p6 = A3(rgbToHsl,_p5._0,_p5._1,_p5._2); | |
var h = _p6._0; | |
var s = _p6._1; | |
var l = _p6._2; | |
return A4(hsla,h + $Basics.degrees(180),s,l,_p5._3); | |
} | |
}; | |
var grayscale = function (p) { return A4(HSLA,0,0,1 - p,1);}; | |
var greyscale = function (p) { return A4(HSLA,0,0,1 - p,1);}; | |
var RGBA = F4(function (a,b,c,d) { | |
return {ctor: "RGBA",_0: a,_1: b,_2: c,_3: d}; | |
}); | |
var rgba = RGBA; | |
var rgb = F3(function (r,g,b) { return A4(RGBA,r,g,b,1);}); | |
var lightRed = A4(RGBA,239,41,41,1); | |
var red = A4(RGBA,204,0,0,1); | |
var darkRed = A4(RGBA,164,0,0,1); | |
var lightOrange = A4(RGBA,252,175,62,1); | |
var orange = A4(RGBA,245,121,0,1); | |
var darkOrange = A4(RGBA,206,92,0,1); | |
var lightYellow = A4(RGBA,255,233,79,1); | |
var yellow = A4(RGBA,237,212,0,1); | |
var darkYellow = A4(RGBA,196,160,0,1); | |
var lightGreen = A4(RGBA,138,226,52,1); | |
var green = A4(RGBA,115,210,22,1); | |
var darkGreen = A4(RGBA,78,154,6,1); | |
var lightBlue = A4(RGBA,114,159,207,1); | |
var blue = A4(RGBA,52,101,164,1); | |
var darkBlue = A4(RGBA,32,74,135,1); | |
var lightPurple = A4(RGBA,173,127,168,1); | |
var purple = A4(RGBA,117,80,123,1); | |
var darkPurple = A4(RGBA,92,53,102,1); | |
var lightBrown = A4(RGBA,233,185,110,1); | |
var brown = A4(RGBA,193,125,17,1); | |
var darkBrown = A4(RGBA,143,89,2,1); | |
var black = A4(RGBA,0,0,0,1); | |
var white = A4(RGBA,255,255,255,1); | |
var lightGrey = A4(RGBA,238,238,236,1); | |
var grey = A4(RGBA,211,215,207,1); | |
var darkGrey = A4(RGBA,186,189,182,1); | |
var lightGray = A4(RGBA,238,238,236,1); | |
var gray = A4(RGBA,211,215,207,1); | |
var darkGray = A4(RGBA,186,189,182,1); | |
var lightCharcoal = A4(RGBA,136,138,133,1); | |
var charcoal = A4(RGBA,85,87,83,1); | |
var darkCharcoal = A4(RGBA,46,52,54,1); | |
return _elm.Color.values = {_op: _op | |
,rgb: rgb | |
,rgba: rgba | |
,hsl: hsl | |
,hsla: hsla | |
,greyscale: greyscale | |
,grayscale: grayscale | |
,complement: complement | |
,linear: linear | |
,radial: radial | |
,toRgb: toRgb | |
,toHsl: toHsl | |
,red: red | |
,orange: orange | |
,yellow: yellow | |
,green: green | |
,blue: blue | |
,purple: purple | |
,brown: brown | |
,lightRed: lightRed | |
,lightOrange: lightOrange | |
,lightYellow: lightYellow | |
,lightGreen: lightGreen | |
,lightBlue: lightBlue | |
,lightPurple: lightPurple | |
,lightBrown: lightBrown | |
,darkRed: darkRed | |
,darkOrange: darkOrange | |
,darkYellow: darkYellow | |
,darkGreen: darkGreen | |
,darkBlue: darkBlue | |
,darkPurple: darkPurple | |
,darkBrown: darkBrown | |
,white: white | |
,lightGrey: lightGrey | |
,grey: grey | |
,darkGrey: darkGrey | |
,lightCharcoal: lightCharcoal | |
,charcoal: charcoal | |
,darkCharcoal: darkCharcoal | |
,black: black | |
,lightGray: lightGray | |
,gray: gray | |
,darkGray: darkGray}; | |
}; | |
Elm.Native.Signal = {}; | |
Elm.Native.Signal.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Signal = localRuntime.Native.Signal || {}; | |
if (localRuntime.Native.Signal.values) | |
{ | |
return localRuntime.Native.Signal.values; | |
} | |
var Task = Elm.Native.Task.make(localRuntime); | |
var Utils = Elm.Native.Utils.make(localRuntime); | |
function broadcastToKids(node, timestamp, update) | |
{ | |
var kids = node.kids; | |
for (var i = kids.length; i--; ) | |
{ | |
kids[i].notify(timestamp, update, node.id); | |
} | |
} | |
// INPUT | |
function input(name, base) | |
{ | |
var node = { | |
id: Utils.guid(), | |
name: 'input-' + name, | |
value: base, | |
parents: [], | |
kids: [] | |
}; | |
node.notify = function(timestamp, targetId, value) { | |
var update = targetId === node.id; | |
if (update) | |
{ | |
node.value = value; | |
} | |
broadcastToKids(node, timestamp, update); | |
return update; | |
}; | |
localRuntime.inputs.push(node); | |
return node; | |
} | |
function constant(value) | |
{ | |
return input('constant', value); | |
} | |
// MAILBOX | |
function mailbox(base) | |
{ | |
var signal = input('mailbox', base); | |
function send(value) { | |
return Task.asyncFunction(function(callback) { | |
localRuntime.setTimeout(function() { | |
localRuntime.notify(signal.id, value); | |
}, 0); | |
callback(Task.succeed(Utils.Tuple0)); | |
}); | |
} | |
return { | |
signal: signal, | |
address: { | |
ctor: 'Address', | |
_0: send | |
} | |
}; | |
} | |
function sendMessage(message) | |
{ | |
Task.perform(message._0); | |
} | |
// OUTPUT | |
function output(name, handler, parent) | |
{ | |
var node = { | |
id: Utils.guid(), | |
name: 'output-' + name, | |
parents: [parent], | |
isOutput: true | |
}; | |
node.notify = function(timestamp, parentUpdate, parentID) | |
{ | |
if (parentUpdate) | |
{ | |
handler(parent.value); | |
} | |
}; | |
parent.kids.push(node); | |
return node; | |
} | |
// MAP | |
function mapMany(refreshValue, args) | |
{ | |
var node = { | |
id: Utils.guid(), | |
name: 'map' + args.length, | |
value: refreshValue(), | |
parents: args, | |
kids: [] | |
}; | |
var numberOfParents = args.length; | |
var count = 0; | |
var update = false; | |
node.notify = function(timestamp, parentUpdate, parentID) | |
{ | |
++count; | |
update = update || parentUpdate; | |
if (count === numberOfParents) | |
{ | |
if (update) | |
{ | |
node.value = refreshValue(); | |
} | |
broadcastToKids(node, timestamp, update); | |
update = false; | |
count = 0; | |
} | |
}; | |
for (var i = numberOfParents; i--; ) | |
{ | |
args[i].kids.push(node); | |
} | |
return node; | |
} | |
function map(func, a) | |
{ | |
function refreshValue() | |
{ | |
return func(a.value); | |
} | |
return mapMany(refreshValue, [a]); | |
} | |
function map2(func, a, b) | |
{ | |
function refreshValue() | |
{ | |
return A2( func, a.value, b.value ); | |
} | |
return mapMany(refreshValue, [a, b]); | |
} | |
function map3(func, a, b, c) | |
{ | |
function refreshValue() | |
{ | |
return A3( func, a.value, b.value, c.value ); | |
} | |
return mapMany(refreshValue, [a, b, c]); | |
} | |
function map4(func, a, b, c, d) | |
{ | |
function refreshValue() | |
{ | |
return A4( func, a.value, b.value, c.value, d.value ); | |
} | |
return mapMany(refreshValue, [a, b, c, d]); | |
} | |
function map5(func, a, b, c, d, e) | |
{ | |
function refreshValue() | |
{ | |
return A5( func, a.value, b.value, c.value, d.value, e.value ); | |
} | |
return mapMany(refreshValue, [a, b, c, d, e]); | |
} | |
// FOLD | |
function foldp(update, state, signal) | |
{ | |
var node = { | |
id: Utils.guid(), | |
name: 'foldp', | |
parents: [signal], | |
kids: [], | |
value: state | |
}; | |
node.notify = function(timestamp, parentUpdate, parentID) | |
{ | |
if (parentUpdate) | |
{ | |
node.value = A2( update, signal.value, node.value ); | |
} | |
broadcastToKids(node, timestamp, parentUpdate); | |
}; | |
signal.kids.push(node); | |
return node; | |
} | |
// TIME | |
function timestamp(signal) | |
{ | |
var node = { | |
id: Utils.guid(), | |
name: 'timestamp', | |
value: Utils.Tuple2(localRuntime.timer.programStart, signal.value), | |
parents: [signal], | |
kids: [] | |
}; | |
node.notify = function(timestamp, parentUpdate, parentID) | |
{ | |
if (parentUpdate) | |
{ | |
node.value = Utils.Tuple2(timestamp, signal.value); | |
} | |
broadcastToKids(node, timestamp, parentUpdate); | |
}; | |
signal.kids.push(node); | |
return node; | |
} | |
function delay(time, signal) | |
{ | |
var delayed = input('delay-input-' + time, signal.value); | |
function handler(value) | |
{ | |
setTimeout(function() { | |
localRuntime.notify(delayed.id, value); | |
}, time); | |
} | |
output('delay-output-' + time, handler, signal); | |
return delayed; | |
} | |
// MERGING | |
function genericMerge(tieBreaker, leftStream, rightStream) | |
{ | |
var node = { | |
id: Utils.guid(), | |
name: 'merge', | |
value: A2(tieBreaker, leftStream.value, rightStream.value), | |
parents: [leftStream, rightStream], | |
kids: [] | |
}; | |
var left = { touched: false, update: false, value: null }; | |
var right = { touched: false, update: false, value: null }; | |
node.notify = function(timestamp, parentUpdate, parentID) | |
{ | |
if (parentID === leftStream.id) | |
{ | |
left.touched = true; | |
left.update = parentUpdate; | |
left.value = leftStream.value; | |
} | |
if (parentID === rightStream.id) | |
{ | |
right.touched = true; | |
right.update = parentUpdate; | |
right.value = rightStream.value; | |
} | |
if (left.touched && right.touched) | |
{ | |
var update = false; | |
if (left.update && right.update) | |
{ | |
node.value = A2(tieBreaker, left.value, right.value); | |
update = true; | |
} | |
else if (left.update) | |
{ | |
node.value = left.value; | |
update = true; | |
} | |
else if (right.update) | |
{ | |
node.value = right.value; | |
update = true; | |
} | |
left.touched = false; | |
right.touched = false; | |
broadcastToKids(node, timestamp, update); | |
} | |
}; | |
leftStream.kids.push(node); | |
rightStream.kids.push(node); | |
return node; | |
} | |
// FILTERING | |
function filterMap(toMaybe, base, signal) | |
{ | |
var maybe = toMaybe(signal.value); | |
var node = { | |
id: Utils.guid(), | |
name: 'filterMap', | |
value: maybe.ctor === 'Nothing' ? base : maybe._0, | |
parents: [signal], | |
kids: [] | |
}; | |
node.notify = function(timestamp, parentUpdate, parentID) | |
{ | |
var update = false; | |
if (parentUpdate) | |
{ | |
var maybe = toMaybe(signal.value); | |
if (maybe.ctor === 'Just') | |
{ | |
update = true; | |
node.value = maybe._0; | |
} | |
} | |
broadcastToKids(node, timestamp, update); | |
}; | |
signal.kids.push(node); | |
return node; | |
} | |
// SAMPLING | |
function sampleOn(ticker, signal) | |
{ | |
var node = { | |
id: Utils.guid(), | |
name: 'sampleOn', | |
value: signal.value, | |
parents: [ticker, signal], | |
kids: [] | |
}; | |
var signalTouch = false; | |
var tickerTouch = false; | |
var tickerUpdate = false; | |
node.notify = function(timestamp, parentUpdate, parentID) | |
{ | |
if (parentID === ticker.id) | |
{ | |
tickerTouch = true; | |
tickerUpdate = parentUpdate; | |
} | |
if (parentID === signal.id) | |
{ | |
signalTouch = true; | |
} | |
if (tickerTouch && signalTouch) | |
{ | |
if (tickerUpdate) | |
{ | |
node.value = signal.value; | |
} | |
tickerTouch = false; | |
signalTouch = false; | |
broadcastToKids(node, timestamp, tickerUpdate); | |
} | |
}; | |
ticker.kids.push(node); | |
signal.kids.push(node); | |
return node; | |
} | |
// DROP REPEATS | |
function dropRepeats(signal) | |
{ | |
var node = { | |
id: Utils.guid(), | |
name: 'dropRepeats', | |
value: signal.value, | |
parents: [signal], | |
kids: [] | |
}; | |
node.notify = function(timestamp, parentUpdate, parentID) | |
{ | |
var update = false; | |
if (parentUpdate && !Utils.eq(node.value, signal.value)) | |
{ | |
node.value = signal.value; | |
update = true; | |
} | |
broadcastToKids(node, timestamp, update); | |
}; | |
signal.kids.push(node); | |
return node; | |
} | |
return localRuntime.Native.Signal.values = { | |
input: input, | |
constant: constant, | |
mailbox: mailbox, | |
sendMessage: sendMessage, | |
output: output, | |
map: F2(map), | |
map2: F3(map2), | |
map3: F4(map3), | |
map4: F5(map4), | |
map5: F6(map5), | |
foldp: F3(foldp), | |
genericMerge: F3(genericMerge), | |
filterMap: F3(filterMap), | |
sampleOn: F2(sampleOn), | |
dropRepeats: dropRepeats, | |
timestamp: timestamp, | |
delay: F2(delay) | |
}; | |
}; | |
Elm.Native.Time = {}; | |
Elm.Native.Time.make = function(localRuntime) | |
{ | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Time = localRuntime.Native.Time || {}; | |
if (localRuntime.Native.Time.values) | |
{ | |
return localRuntime.Native.Time.values; | |
} | |
var NS = Elm.Native.Signal.make(localRuntime); | |
var Maybe = Elm.Maybe.make(localRuntime); | |
// FRAMES PER SECOND | |
function fpsWhen(desiredFPS, isOn) | |
{ | |
var msPerFrame = 1000 / desiredFPS; | |
var ticker = NS.input('fps-' + desiredFPS, null); | |
function notifyTicker() | |
{ | |
localRuntime.notify(ticker.id, null); | |
} | |
function firstArg(x, y) | |
{ | |
return x; | |
} | |
// input fires either when isOn changes, or when ticker fires. | |
// Its value is a tuple with the current timestamp, and the state of isOn | |
var input = NS.timestamp(A3(NS.map2, F2(firstArg), NS.dropRepeats(isOn), ticker)); | |
var initialState = { | |
isOn: false, | |
time: localRuntime.timer.programStart, | |
delta: 0 | |
}; | |
var timeoutId; | |
function update(input, state) | |
{ | |
var currentTime = input._0; | |
var isOn = input._1; | |
var wasOn = state.isOn; | |
var previousTime = state.time; | |
if (isOn) | |
{ | |
timeoutId = localRuntime.setTimeout(notifyTicker, msPerFrame); | |
} | |
else if (wasOn) | |
{ | |
clearTimeout(timeoutId); | |
} | |
return { | |
isOn: isOn, | |
time: currentTime, | |
delta: (isOn && !wasOn) ? 0 : currentTime - previousTime | |
}; | |
} | |
return A2( | |
NS.map, | |
function(state) { return state.delta; }, | |
A3(NS.foldp, F2(update), update(input.value, initialState), input) | |
); | |
} | |
// EVERY | |
function every(t) | |
{ | |
var ticker = NS.input('every-' + t, null); | |
function tellTime() | |
{ | |
localRuntime.notify(ticker.id, null); | |
} | |
var clock = A2(NS.map, fst, NS.timestamp(ticker)); | |
setInterval(tellTime, t); | |
return clock; | |
} | |
function fst(pair) | |
{ | |
return pair._0; | |
} | |
function read(s) | |
{ | |
var t = Date.parse(s); | |
return isNaN(t) ? Maybe.Nothing : Maybe.Just(t); | |
} | |
return localRuntime.Native.Time.values = { | |
fpsWhen: F2(fpsWhen), | |
every: every, | |
toDate: function(t) { return new Date(t); }, | |
read: read | |
}; | |
}; | |
Elm.Native.Transform2D = {}; | |
Elm.Native.Transform2D.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Transform2D = localRuntime.Native.Transform2D || {}; | |
if (localRuntime.Native.Transform2D.values) | |
{ | |
return localRuntime.Native.Transform2D.values; | |
} | |
var A; | |
if (typeof Float32Array === 'undefined') | |
{ | |
A = function(arr) | |
{ | |
this.length = arr.length; | |
this[0] = arr[0]; | |
this[1] = arr[1]; | |
this[2] = arr[2]; | |
this[3] = arr[3]; | |
this[4] = arr[4]; | |
this[5] = arr[5]; | |
}; | |
} | |
else | |
{ | |
A = Float32Array; | |
} | |
// layout of matrix in an array is | |
// | |
// | m11 m12 dx | | |
// | m21 m22 dy | | |
// | 0 0 1 | | |
// | |
// new A([ m11, m12, dx, m21, m22, dy ]) | |
var identity = new A([1, 0, 0, 0, 1, 0]); | |
function matrix(m11, m12, m21, m22, dx, dy) | |
{ | |
return new A([m11, m12, dx, m21, m22, dy]); | |
} | |
function rotation(t) | |
{ | |
var c = Math.cos(t); | |
var s = Math.sin(t); | |
return new A([c, -s, 0, s, c, 0]); | |
} | |
function rotate(t, m) | |
{ | |
var c = Math.cos(t); | |
var s = Math.sin(t); | |
var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4]; | |
return new A([m11 * c + m12 * s, -m11 * s + m12 * c, m[2], | |
m21 * c + m22 * s, -m21 * s + m22 * c, m[5]]); | |
} | |
/* | |
function move(xy,m) { | |
var x = xy._0; | |
var y = xy._1; | |
var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4]; | |
return new A([m11, m12, m11*x + m12*y + m[2], | |
m21, m22, m21*x + m22*y + m[5]]); | |
} | |
function scale(s,m) { return new A([m[0]*s, m[1]*s, m[2], m[3]*s, m[4]*s, m[5]]); } | |
function scaleX(x,m) { return new A([m[0]*x, m[1], m[2], m[3]*x, m[4], m[5]]); } | |
function scaleY(y,m) { return new A([m[0], m[1]*y, m[2], m[3], m[4]*y, m[5]]); } | |
function reflectX(m) { return new A([-m[0], m[1], m[2], -m[3], m[4], m[5]]); } | |
function reflectY(m) { return new A([m[0], -m[1], m[2], m[3], -m[4], m[5]]); } | |
function transform(m11, m21, m12, m22, mdx, mdy, n) { | |
var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5]; | |
return new A([m11*n11 + m12*n21, | |
m11*n12 + m12*n22, | |
m11*ndx + m12*ndy + mdx, | |
m21*n11 + m22*n21, | |
m21*n12 + m22*n22, | |
m21*ndx + m22*ndy + mdy]); | |
} | |
*/ | |
function multiply(m, n) | |
{ | |
var m11 = m[0], m12 = m[1], m21 = m[3], m22 = m[4], mdx = m[2], mdy = m[5]; | |
var n11 = n[0], n12 = n[1], n21 = n[3], n22 = n[4], ndx = n[2], ndy = n[5]; | |
return new A([m11 * n11 + m12 * n21, | |
m11 * n12 + m12 * n22, | |
m11 * ndx + m12 * ndy + mdx, | |
m21 * n11 + m22 * n21, | |
m21 * n12 + m22 * n22, | |
m21 * ndx + m22 * ndy + mdy]); | |
} | |
return localRuntime.Native.Transform2D.values = { | |
identity: identity, | |
matrix: F6(matrix), | |
rotation: rotation, | |
multiply: F2(multiply) | |
/* | |
transform: F7(transform), | |
rotate: F2(rotate), | |
move: F2(move), | |
scale: F2(scale), | |
scaleX: F2(scaleX), | |
scaleY: F2(scaleY), | |
reflectX: reflectX, | |
reflectY: reflectY | |
*/ | |
}; | |
}; | |
Elm.Transform2D = Elm.Transform2D || {}; | |
Elm.Transform2D.make = function (_elm) { | |
"use strict"; | |
_elm.Transform2D = _elm.Transform2D || {}; | |
if (_elm.Transform2D.values) return _elm.Transform2D.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Native$Transform2D = Elm.Native.Transform2D.make(_elm); | |
var _op = {}; | |
var multiply = $Native$Transform2D.multiply; | |
var rotation = $Native$Transform2D.rotation; | |
var matrix = $Native$Transform2D.matrix; | |
var translation = F2(function (x,y) { | |
return A6(matrix,1,0,0,1,x,y); | |
}); | |
var scale = function (s) { return A6(matrix,s,0,0,s,0,0);}; | |
var scaleX = function (x) { return A6(matrix,x,0,0,1,0,0);}; | |
var scaleY = function (y) { return A6(matrix,1,0,0,y,0,0);}; | |
var identity = $Native$Transform2D.identity; | |
var Transform2D = {ctor: "Transform2D"}; | |
return _elm.Transform2D.values = {_op: _op | |
,identity: identity | |
,matrix: matrix | |
,multiply: multiply | |
,rotation: rotation | |
,translation: translation | |
,scale: scale | |
,scaleX: scaleX | |
,scaleY: scaleY}; | |
}; | |
// setup | |
Elm.Native = Elm.Native || {}; | |
Elm.Native.Graphics = Elm.Native.Graphics || {}; | |
Elm.Native.Graphics.Collage = Elm.Native.Graphics.Collage || {}; | |
// definition | |
Elm.Native.Graphics.Collage.make = function(localRuntime) { | |
'use strict'; | |
// attempt to short-circuit | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Graphics = localRuntime.Native.Graphics || {}; | |
localRuntime.Native.Graphics.Collage = localRuntime.Native.Graphics.Collage || {}; | |
if ('values' in localRuntime.Native.Graphics.Collage) | |
{ | |
return localRuntime.Native.Graphics.Collage.values; | |
} | |
// okay, we cannot short-ciruit, so now we define everything | |
var Color = Elm.Native.Color.make(localRuntime); | |
var List = Elm.Native.List.make(localRuntime); | |
var NativeElement = Elm.Native.Graphics.Element.make(localRuntime); | |
var Transform = Elm.Transform2D.make(localRuntime); | |
var Utils = Elm.Native.Utils.make(localRuntime); | |
function setStrokeStyle(ctx, style) | |
{ | |
ctx.lineWidth = style.width; | |
var cap = style.cap.ctor; | |
ctx.lineCap = cap === 'Flat' | |
? 'butt' | |
: cap === 'Round' | |
? 'round' | |
: 'square'; | |
var join = style.join.ctor; | |
ctx.lineJoin = join === 'Smooth' | |
? 'round' | |
: join === 'Sharp' | |
? 'miter' | |
: 'bevel'; | |
ctx.miterLimit = style.join._0 || 10; | |
ctx.strokeStyle = Color.toCss(style.color); | |
} | |
function setFillStyle(redo, ctx, style) | |
{ | |
var sty = style.ctor; | |
ctx.fillStyle = sty === 'Solid' | |
? Color.toCss(style._0) | |
: sty === 'Texture' | |
? texture(redo, ctx, style._0) | |
: gradient(ctx, style._0); | |
} | |
function trace(ctx, path) | |
{ | |
var points = List.toArray(path); | |
var i = points.length - 1; | |
if (i <= 0) | |
{ | |
return; | |
} | |
ctx.moveTo(points[i]._0, points[i]._1); | |
while (i--) | |
{ | |
ctx.lineTo(points[i]._0, points[i]._1); | |
} | |
if (path.closed) | |
{ | |
i = points.length - 1; | |
ctx.lineTo(points[i]._0, points[i]._1); | |
} | |
} | |
function line(ctx, style, path) | |
{ | |
if (style.dashing.ctor === '[]') | |
{ | |
trace(ctx, path); | |
} | |
else | |
{ | |
customLineHelp(ctx, style, path); | |
} | |
ctx.scale(1, -1); | |
ctx.stroke(); | |
} | |
function customLineHelp(ctx, style, path) | |
{ | |
var points = List.toArray(path); | |
if (path.closed) | |
{ | |
points.push(points[0]); | |
} | |
var pattern = List.toArray(style.dashing); | |
var i = points.length - 1; | |
if (i <= 0) | |
{ | |
return; | |
} | |
var x0 = points[i]._0, y0 = points[i]._1; | |
var x1 = 0, y1 = 0, dx = 0, dy = 0, remaining = 0; | |
var pindex = 0, plen = pattern.length; | |
var draw = true, segmentLength = pattern[0]; | |
ctx.moveTo(x0, y0); | |
while (i--) | |
{ | |
x1 = points[i]._0; | |
y1 = points[i]._1; | |
dx = x1 - x0; | |
dy = y1 - y0; | |
remaining = Math.sqrt(dx * dx + dy * dy); | |
while (segmentLength <= remaining) | |
{ | |
x0 += dx * segmentLength / remaining; | |
y0 += dy * segmentLength / remaining; | |
ctx[draw ? 'lineTo' : 'moveTo'](x0, y0); | |
// update starting position | |
dx = x1 - x0; | |
dy = y1 - y0; | |
remaining = Math.sqrt(dx * dx + dy * dy); | |
// update pattern | |
draw = !draw; | |
pindex = (pindex + 1) % plen; | |
segmentLength = pattern[pindex]; | |
} | |
if (remaining > 0) | |
{ | |
ctx[draw ? 'lineTo' : 'moveTo'](x1, y1); | |
segmentLength -= remaining; | |
} | |
x0 = x1; | |
y0 = y1; | |
} | |
} | |
function drawLine(ctx, style, path) | |
{ | |
setStrokeStyle(ctx, style); | |
return line(ctx, style, path); | |
} | |
function texture(redo, ctx, src) | |
{ | |
var img = new Image(); | |
img.src = src; | |
img.onload = redo; | |
return ctx.createPattern(img, 'repeat'); | |
} | |
function gradient(ctx, grad) | |
{ | |
var g; | |
var stops = []; | |
if (grad.ctor === 'Linear') | |
{ | |
var p0 = grad._0, p1 = grad._1; | |
g = ctx.createLinearGradient(p0._0, -p0._1, p1._0, -p1._1); | |
stops = List.toArray(grad._2); | |
} | |
else | |
{ | |
var p0 = grad._0, p2 = grad._2; | |
g = ctx.createRadialGradient(p0._0, -p0._1, grad._1, p2._0, -p2._1, grad._3); | |
stops = List.toArray(grad._4); | |
} | |
var len = stops.length; | |
for (var i = 0; i < len; ++i) | |
{ | |
var stop = stops[i]; | |
g.addColorStop(stop._0, Color.toCss(stop._1)); | |
} | |
return g; | |
} | |
function drawShape(redo, ctx, style, path) | |
{ | |
trace(ctx, path); | |
setFillStyle(redo, ctx, style); | |
ctx.scale(1, -1); | |
ctx.fill(); | |
} | |
// TEXT RENDERING | |
function fillText(redo, ctx, text) | |
{ | |
drawText(ctx, text, ctx.fillText); | |
} | |
function strokeText(redo, ctx, style, text) | |
{ | |
setStrokeStyle(ctx, style); | |
// Use native canvas API for dashes only for text for now | |
// Degrades to non-dashed on IE 9 + 10 | |
if (style.dashing.ctor !== '[]' && ctx.setLineDash) | |
{ | |
var pattern = List.toArray(style.dashing); | |
ctx.setLineDash(pattern); | |
} | |
drawText(ctx, text, ctx.strokeText); | |
} | |
function drawText(ctx, text, canvasDrawFn) | |
{ | |
var textChunks = chunkText(defaultContext, text); | |
var totalWidth = 0; | |
var maxHeight = 0; | |
var numChunks = textChunks.length; | |
ctx.scale(1,-1); | |
for (var i = numChunks; i--; ) | |
{ | |
var chunk = textChunks[i]; | |
ctx.font = chunk.font; | |
var metrics = ctx.measureText(chunk.text); | |
chunk.width = metrics.width; | |
totalWidth += chunk.width; | |
if (chunk.height > maxHeight) | |
{ | |
maxHeight = chunk.height; | |
} | |
} | |
var x = -totalWidth / 2.0; | |
for (var i = 0; i < numChunks; ++i) | |
{ | |
var chunk = textChunks[i]; | |
ctx.font = chunk.font; | |
ctx.fillStyle = chunk.color; | |
canvasDrawFn.call(ctx, chunk.text, x, maxHeight / 2); | |
x += chunk.width; | |
} | |
} | |
function toFont(props) | |
{ | |
return [ | |
props['font-style'], | |
props['font-variant'], | |
props['font-weight'], | |
props['font-size'], | |
props['font-family'] | |
].join(' '); | |
} | |
// Convert the object returned by the text module | |
// into something we can use for styling canvas text | |
function chunkText(context, text) | |
{ | |
var tag = text.ctor; | |
if (tag === 'Text:Append') | |
{ | |
var leftChunks = chunkText(context, text._0); | |
var rightChunks = chunkText(context, text._1); | |
return leftChunks.concat(rightChunks); | |
} | |
if (tag === 'Text:Text') | |
{ | |
return [{ | |
text: text._0, | |
color: context.color, | |
height: context['font-size'].slice(0, -2) | 0, | |
font: toFont(context) | |
}]; | |
} | |
if (tag === 'Text:Meta') | |
{ | |
var newContext = freshContext(text._0, context); | |
return chunkText(newContext, text._1); | |
} | |
} | |
function freshContext(props, ctx) | |
{ | |
return { | |
'font-style': props['font-style'] || ctx['font-style'], | |
'font-variant': props['font-variant'] || ctx['font-variant'], | |
'font-weight': props['font-weight'] || ctx['font-weight'], | |
'font-size': props['font-size'] || ctx['font-size'], | |
'font-family': props['font-family'] || ctx['font-family'], | |
'color': props['color'] || ctx['color'] | |
}; | |
} | |
var defaultContext = { | |
'font-style': 'normal', | |
'font-variant': 'normal', | |
'font-weight': 'normal', | |
'font-size': '12px', | |
'font-family': 'sans-serif', | |
'color': 'black' | |
}; | |
// IMAGES | |
function drawImage(redo, ctx, form) | |
{ | |
var img = new Image(); | |
img.onload = redo; | |
img.src = form._3; | |
var w = form._0, | |
h = form._1, | |
pos = form._2, | |
srcX = pos._0, | |
srcY = pos._1, | |
srcW = w, | |
srcH = h, | |
destX = -w / 2, | |
destY = -h / 2, | |
destW = w, | |
destH = h; | |
ctx.scale(1, -1); | |
ctx.drawImage(img, srcX, srcY, srcW, srcH, destX, destY, destW, destH); | |
} | |
function renderForm(redo, ctx, form) | |
{ | |
ctx.save(); | |
var x = form.x, | |
y = form.y, | |
theta = form.theta, | |
scale = form.scale; | |
if (x !== 0 || y !== 0) | |
{ | |
ctx.translate(x, y); | |
} | |
if (theta !== 0) | |
{ | |
ctx.rotate(theta % (Math.PI * 2)); | |
} | |
if (scale !== 1) | |
{ | |
ctx.scale(scale, scale); | |
} | |
if (form.alpha !== 1) | |
{ | |
ctx.globalAlpha = ctx.globalAlpha * form.alpha; | |
} | |
ctx.beginPath(); | |
var f = form.form; | |
switch (f.ctor) | |
{ | |
case 'FPath': | |
drawLine(ctx, f._0, f._1); | |
break; | |
case 'FImage': | |
drawImage(redo, ctx, f); | |
break; | |
case 'FShape': | |
if (f._0.ctor === 'Line') | |
{ | |
f._1.closed = true; | |
drawLine(ctx, f._0._0, f._1); | |
} | |
else | |
{ | |
drawShape(redo, ctx, f._0._0, f._1); | |
} | |
break; | |
case 'FText': | |
fillText(redo, ctx, f._0); | |
break; | |
case 'FOutlinedText': | |
strokeText(redo, ctx, f._0, f._1); | |
break; | |
} | |
ctx.restore(); | |
} | |
function formToMatrix(form) | |
{ | |
var scale = form.scale; | |
var matrix = A6( Transform.matrix, scale, 0, 0, scale, form.x, form.y ); | |
var theta = form.theta; | |
if (theta !== 0) | |
{ | |
matrix = A2( Transform.multiply, matrix, Transform.rotation(theta) ); | |
} | |
return matrix; | |
} | |
function str(n) | |
{ | |
if (n < 0.00001 && n > -0.00001) | |
{ | |
return 0; | |
} | |
return n; | |
} | |
function makeTransform(w, h, form, matrices) | |
{ | |
var props = form.form._0._0.props; | |
var m = A6( Transform.matrix, 1, 0, 0, -1, | |
(w - props.width ) / 2, | |
(h - props.height) / 2 ); | |
var len = matrices.length; | |
for (var i = 0; i < len; ++i) | |
{ | |
m = A2( Transform.multiply, m, matrices[i] ); | |
} | |
m = A2( Transform.multiply, m, formToMatrix(form) ); | |
return 'matrix(' + | |
str( m[0]) + ', ' + str( m[3]) + ', ' + | |
str(-m[1]) + ', ' + str(-m[4]) + ', ' + | |
str( m[2]) + ', ' + str( m[5]) + ')'; | |
} | |
function stepperHelp(list) | |
{ | |
var arr = List.toArray(list); | |
var i = 0; | |
function peekNext() | |
{ | |
return i < arr.length ? arr[i]._0.form.ctor : ''; | |
} | |
// assumes that there is a next element | |
function next() | |
{ | |
var out = arr[i]._0; | |
++i; | |
return out; | |
} | |
return { | |
peekNext: peekNext, | |
next: next | |
}; | |
} | |
function formStepper(forms) | |
{ | |
var ps = [stepperHelp(forms)]; | |
var matrices = []; | |
var alphas = []; | |
function peekNext() | |
{ | |
var len = ps.length; | |
var formType = ''; | |
for (var i = 0; i < len; ++i ) | |
{ | |
if (formType = ps[i].peekNext()) return formType; | |
} | |
return ''; | |
} | |
// assumes that there is a next element | |
function next(ctx) | |
{ | |
while (!ps[0].peekNext()) | |
{ | |
ps.shift(); | |
matrices.pop(); | |
alphas.shift(); | |
if (ctx) | |
{ | |
ctx.restore(); | |
} | |
} | |
var out = ps[0].next(); | |
var f = out.form; | |
if (f.ctor === 'FGroup') | |
{ | |
ps.unshift(stepperHelp(f._1)); | |
var m = A2(Transform.multiply, f._0, formToMatrix(out)); | |
ctx.save(); | |
ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]); | |
matrices.push(m); | |
var alpha = (alphas[0] || 1) * out.alpha; | |
alphas.unshift(alpha); | |
ctx.globalAlpha = alpha; | |
} | |
return out; | |
} | |
function transforms() | |
{ | |
return matrices; | |
} | |
function alpha() | |
{ | |
return alphas[0] || 1; | |
} | |
return { | |
peekNext: peekNext, | |
next: next, | |
transforms: transforms, | |
alpha: alpha | |
}; | |
} | |
function makeCanvas(w, h) | |
{ | |
var canvas = NativeElement.createNode('canvas'); | |
canvas.style.width = w + 'px'; | |
canvas.style.height = h + 'px'; | |
canvas.style.display = 'block'; | |
canvas.style.position = 'absolute'; | |
var ratio = window.devicePixelRatio || 1; | |
canvas.width = w * ratio; | |
canvas.height = h * ratio; | |
return canvas; | |
} | |
function render(model) | |
{ | |
var div = NativeElement.createNode('div'); | |
div.style.overflow = 'hidden'; | |
div.style.position = 'relative'; | |
update(div, model, model); | |
return div; | |
} | |
function nodeStepper(w, h, div) | |
{ | |
var kids = div.childNodes; | |
var i = 0; | |
var ratio = window.devicePixelRatio || 1; | |
function transform(transforms, ctx) | |
{ | |
ctx.translate( w / 2 * ratio, h / 2 * ratio ); | |
ctx.scale( ratio, -ratio ); | |
var len = transforms.length; | |
for (var i = 0; i < len; ++i) | |
{ | |
var m = transforms[i]; | |
ctx.save(); | |
ctx.transform(m[0], m[3], m[1], m[4], m[2], m[5]); | |
} | |
return ctx; | |
} | |
function nextContext(transforms) | |
{ | |
while (i < kids.length) | |
{ | |
var node = kids[i]; | |
if (node.getContext) | |
{ | |
node.width = w * ratio; | |
node.height = h * ratio; | |
node.style.width = w + 'px'; | |
node.style.height = h + 'px'; | |
++i; | |
return transform(transforms, node.getContext('2d')); | |
} | |
div.removeChild(node); | |
} | |
var canvas = makeCanvas(w, h); | |
div.appendChild(canvas); | |
// we have added a new node, so we must step our position | |
++i; | |
return transform(transforms, canvas.getContext('2d')); | |
} | |
function addElement(matrices, alpha, form) | |
{ | |
var kid = kids[i]; | |
var elem = form.form._0; | |
var node = (!kid || kid.getContext) | |
? NativeElement.render(elem) | |
: NativeElement.update(kid, kid.oldElement, elem); | |
node.style.position = 'absolute'; | |
node.style.opacity = alpha * form.alpha * elem._0.props.opacity; | |
NativeElement.addTransform(node.style, makeTransform(w, h, form, matrices)); | |
node.oldElement = elem; | |
++i; | |
if (!kid) | |
{ | |
div.appendChild(node); | |
} | |
else | |
{ | |
div.insertBefore(node, kid); | |
} | |
} | |
function clearRest() | |
{ | |
while (i < kids.length) | |
{ | |
div.removeChild(kids[i]); | |
} | |
} | |
return { | |
nextContext: nextContext, | |
addElement: addElement, | |
clearRest: clearRest | |
}; | |
} | |
function update(div, _, model) | |
{ | |
var w = model.w; | |
var h = model.h; | |
var forms = formStepper(model.forms); | |
var nodes = nodeStepper(w, h, div); | |
var ctx = null; | |
var formType = ''; | |
while (formType = forms.peekNext()) | |
{ | |
// make sure we have context if we need it | |
if (ctx === null && formType !== 'FElement') | |
{ | |
ctx = nodes.nextContext(forms.transforms()); | |
ctx.globalAlpha = forms.alpha(); | |
} | |
var form = forms.next(ctx); | |
// if it is FGroup, all updates are made within formStepper when next is called. | |
if (formType === 'FElement') | |
{ | |
// update or insert an element, get a new context | |
nodes.addElement(forms.transforms(), forms.alpha(), form); | |
ctx = null; | |
} | |
else if (formType !== 'FGroup') | |
{ | |
renderForm(function() { update(div, model, model); }, ctx, form); | |
} | |
} | |
nodes.clearRest(); | |
return div; | |
} | |
function collage(w, h, forms) | |
{ | |
return A3(NativeElement.newElement, w, h, { | |
ctor: 'Custom', | |
type: 'Collage', | |
render: render, | |
update: update, | |
model: {w: w, h: h, forms: forms} | |
}); | |
} | |
return localRuntime.Native.Graphics.Collage.values = { | |
collage: F3(collage) | |
}; | |
}; | |
// setup | |
Elm.Native = Elm.Native || {}; | |
Elm.Native.Graphics = Elm.Native.Graphics || {}; | |
Elm.Native.Graphics.Element = Elm.Native.Graphics.Element || {}; | |
// definition | |
Elm.Native.Graphics.Element.make = function(localRuntime) { | |
'use strict'; | |
// attempt to short-circuit | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Graphics = localRuntime.Native.Graphics || {}; | |
localRuntime.Native.Graphics.Element = localRuntime.Native.Graphics.Element || {}; | |
if ('values' in localRuntime.Native.Graphics.Element) | |
{ | |
return localRuntime.Native.Graphics.Element.values; | |
} | |
var Color = Elm.Native.Color.make(localRuntime); | |
var List = Elm.Native.List.make(localRuntime); | |
var Maybe = Elm.Maybe.make(localRuntime); | |
var Text = Elm.Native.Text.make(localRuntime); | |
var Utils = Elm.Native.Utils.make(localRuntime); | |
// CREATION | |
var createNode = | |
typeof document === 'undefined' | |
? | |
function(_) | |
{ | |
return { | |
style: {}, | |
appendChild: function() {} | |
}; | |
} | |
: | |
function(elementType) | |
{ | |
var node = document.createElement(elementType); | |
node.style.padding = '0'; | |
node.style.margin = '0'; | |
return node; | |
} | |
; | |
function newElement(width, height, elementPrim) | |
{ | |
return { | |
ctor: 'Element_elm_builtin', | |
_0: { | |
element: elementPrim, | |
props: { | |
id: Utils.guid(), | |
width: width, | |
height: height, | |
opacity: 1, | |
color: Maybe.Nothing, | |
href: '', | |
tag: '', | |
hover: Utils.Tuple0, | |
click: Utils.Tuple0 | |
} | |
} | |
}; | |
} | |
// PROPERTIES | |
function setProps(elem, node) | |
{ | |
var props = elem.props; | |
var element = elem.element; | |
var width = props.width - (element.adjustWidth || 0); | |
var height = props.height - (element.adjustHeight || 0); | |
node.style.width = (width | 0) + 'px'; | |
node.style.height = (height | 0) + 'px'; | |
if (props.opacity !== 1) | |
{ | |
node.style.opacity = props.opacity; | |
} | |
if (props.color.ctor === 'Just') | |
{ | |
node.style.backgroundColor = Color.toCss(props.color._0); | |
} | |
if (props.tag !== '') | |
{ | |
node.id = props.tag; | |
} | |
if (props.hover.ctor !== '_Tuple0') | |
{ | |
addHover(node, props.hover); | |
} | |
if (props.click.ctor !== '_Tuple0') | |
{ | |
addClick(node, props.click); | |
} | |
if (props.href !== '') | |
{ | |
var anchor = createNode('a'); | |
anchor.href = props.href; | |
anchor.style.display = 'block'; | |
anchor.style.pointerEvents = 'auto'; | |
anchor.appendChild(node); | |
node = anchor; | |
} | |
return node; | |
} | |
function addClick(e, handler) | |
{ | |
e.style.pointerEvents = 'auto'; | |
e.elm_click_handler = handler; | |
function trigger(ev) | |
{ | |
e.elm_click_handler(Utils.Tuple0); | |
ev.stopPropagation(); | |
} | |
e.elm_click_trigger = trigger; | |
e.addEventListener('click', trigger); | |
} | |
function removeClick(e, handler) | |
{ | |
if (e.elm_click_trigger) | |
{ | |
e.removeEventListener('click', e.elm_click_trigger); | |
e.elm_click_trigger = null; | |
e.elm_click_handler = null; | |
} | |
} | |
function addHover(e, handler) | |
{ | |
e.style.pointerEvents = 'auto'; | |
e.elm_hover_handler = handler; | |
e.elm_hover_count = 0; | |
function over(evt) | |
{ | |
if (e.elm_hover_count++ > 0) return; | |
e.elm_hover_handler(true); | |
evt.stopPropagation(); | |
} | |
function out(evt) | |
{ | |
if (e.contains(evt.toElement || evt.relatedTarget)) return; | |
e.elm_hover_count = 0; | |
e.elm_hover_handler(false); | |
evt.stopPropagation(); | |
} | |
e.elm_hover_over = over; | |
e.elm_hover_out = out; | |
e.addEventListener('mouseover', over); | |
e.addEventListener('mouseout', out); | |
} | |
function removeHover(e) | |
{ | |
e.elm_hover_handler = null; | |
if (e.elm_hover_over) | |
{ | |
e.removeEventListener('mouseover', e.elm_hover_over); | |
e.elm_hover_over = null; | |
} | |
if (e.elm_hover_out) | |
{ | |
e.removeEventListener('mouseout', e.elm_hover_out); | |
e.elm_hover_out = null; | |
} | |
} | |
// IMAGES | |
function image(props, img) | |
{ | |
switch (img._0.ctor) | |
{ | |
case 'Plain': | |
return plainImage(img._3); | |
case 'Fitted': | |
return fittedImage(props.width, props.height, img._3); | |
case 'Cropped': | |
return croppedImage(img, props.width, props.height, img._3); | |
case 'Tiled': | |
return tiledImage(img._3); | |
} | |
} | |
function plainImage(src) | |
{ | |
var img = createNode('img'); | |
img.src = src; | |
img.name = src; | |
img.style.display = 'block'; | |
return img; | |
} | |
function tiledImage(src) | |
{ | |
var div = createNode('div'); | |
div.style.backgroundImage = 'url(' + src + ')'; | |
return div; | |
} | |
function fittedImage(w, h, src) | |
{ | |
var div = createNode('div'); | |
div.style.background = 'url(' + src + ') no-repeat center'; | |
div.style.webkitBackgroundSize = 'cover'; | |
div.style.MozBackgroundSize = 'cover'; | |
div.style.OBackgroundSize = 'cover'; | |
div.style.backgroundSize = 'cover'; | |
return div; | |
} | |
function croppedImage(elem, w, h, src) | |
{ | |
var pos = elem._0._0; | |
var e = createNode('div'); | |
e.style.overflow = 'hidden'; | |
var img = createNode('img'); | |
img.onload = function() { | |
var sw = w / elem._1, sh = h / elem._2; | |
img.style.width = ((this.width * sw) | 0) + 'px'; | |
img.style.height = ((this.height * sh) | 0) + 'px'; | |
img.style.marginLeft = ((- pos._0 * sw) | 0) + 'px'; | |
img.style.marginTop = ((- pos._1 * sh) | 0) + 'px'; | |
}; | |
img.src = src; | |
img.name = src; | |
e.appendChild(img); | |
return e; | |
} | |
// FLOW | |
function goOut(node) | |
{ | |
node.style.position = 'absolute'; | |
return node; | |
} | |
function goDown(node) | |
{ | |
return node; | |
} | |
function goRight(node) | |
{ | |
node.style.styleFloat = 'left'; | |
node.style.cssFloat = 'left'; | |
return node; | |
} | |
var directionTable = { | |
DUp: goDown, | |
DDown: goDown, | |
DLeft: goRight, | |
DRight: goRight, | |
DIn: goOut, | |
DOut: goOut | |
}; | |
function needsReversal(dir) | |
{ | |
return dir === 'DUp' || dir === 'DLeft' || dir === 'DIn'; | |
} | |
function flow(dir, elist) | |
{ | |
var array = List.toArray(elist); | |
var container = createNode('div'); | |
var goDir = directionTable[dir]; | |
if (goDir === goOut) | |
{ | |
container.style.pointerEvents = 'none'; | |
} | |
if (needsReversal(dir)) | |
{ | |
array.reverse(); | |
} | |
var len = array.length; | |
for (var i = 0; i < len; ++i) | |
{ | |
container.appendChild(goDir(render(array[i]))); | |
} | |
return container; | |
} | |
// CONTAINER | |
function toPos(pos) | |
{ | |
return pos.ctor === 'Absolute' | |
? pos._0 + 'px' | |
: (pos._0 * 100) + '%'; | |
} | |
// must clear right, left, top, bottom, and transform | |
// before calling this function | |
function setPos(pos, wrappedElement, e) | |
{ | |
var elem = wrappedElement._0; | |
var element = elem.element; | |
var props = elem.props; | |
var w = props.width + (element.adjustWidth ? element.adjustWidth : 0); | |
var h = props.height + (element.adjustHeight ? element.adjustHeight : 0); | |
e.style.position = 'absolute'; | |
e.style.margin = 'auto'; | |
var transform = ''; | |
switch (pos.horizontal.ctor) | |
{ | |
case 'P': | |
e.style.right = toPos(pos.x); | |
e.style.removeProperty('left'); | |
break; | |
case 'Z': | |
transform = 'translateX(' + ((-w / 2) | 0) + 'px) '; | |
case 'N': | |
e.style.left = toPos(pos.x); | |
e.style.removeProperty('right'); | |
break; | |
} | |
switch (pos.vertical.ctor) | |
{ | |
case 'N': | |
e.style.bottom = toPos(pos.y); | |
e.style.removeProperty('top'); | |
break; | |
case 'Z': | |
transform += 'translateY(' + ((-h / 2) | 0) + 'px)'; | |
case 'P': | |
e.style.top = toPos(pos.y); | |
e.style.removeProperty('bottom'); | |
break; | |
} | |
if (transform !== '') | |
{ | |
addTransform(e.style, transform); | |
} | |
return e; | |
} | |
function addTransform(style, transform) | |
{ | |
style.transform = transform; | |
style.msTransform = transform; | |
style.MozTransform = transform; | |
style.webkitTransform = transform; | |
style.OTransform = transform; | |
} | |
function container(pos, elem) | |
{ | |
var e = render(elem); | |
setPos(pos, elem, e); | |
var div = createNode('div'); | |
div.style.position = 'relative'; | |
div.style.overflow = 'hidden'; | |
div.appendChild(e); | |
return div; | |
} | |
function rawHtml(elem) | |
{ | |
var html = elem.html; | |
var align = elem.align; | |
var div = createNode('div'); | |
div.innerHTML = html; | |
div.style.visibility = 'hidden'; | |
if (align) | |
{ | |
div.style.textAlign = align; | |
} | |
div.style.visibility = 'visible'; | |
div.style.pointerEvents = 'auto'; | |
return div; | |
} | |
// RENDER | |
function render(wrappedElement) | |
{ | |
var elem = wrappedElement._0; | |
return setProps(elem, makeElement(elem)); | |
} | |
function makeElement(e) | |
{ | |
var elem = e.element; | |
switch (elem.ctor) | |
{ | |
case 'Image': | |
return image(e.props, elem); | |
case 'Flow': | |
return flow(elem._0.ctor, elem._1); | |
case 'Container': | |
return container(elem._0, elem._1); | |
case 'Spacer': | |
return createNode('div'); | |
case 'RawHtml': | |
return rawHtml(elem); | |
case 'Custom': | |
return elem.render(elem.model); | |
} | |
} | |
function updateAndReplace(node, curr, next) | |
{ | |
var newNode = update(node, curr, next); | |
if (newNode !== node) | |
{ | |
node.parentNode.replaceChild(newNode, node); | |
} | |
return newNode; | |
} | |
// UPDATE | |
function update(node, wrappedCurrent, wrappedNext) | |
{ | |
var curr = wrappedCurrent._0; | |
var next = wrappedNext._0; | |
var rootNode = node; | |
if (node.tagName === 'A') | |
{ | |
node = node.firstChild; | |
} | |
if (curr.props.id === next.props.id) | |
{ | |
updateProps(node, curr, next); | |
return rootNode; | |
} | |
if (curr.element.ctor !== next.element.ctor) | |
{ | |
return render(wrappedNext); | |
} | |
var nextE = next.element; | |
var currE = curr.element; | |
switch (nextE.ctor) | |
{ | |
case 'Spacer': | |
updateProps(node, curr, next); | |
return rootNode; | |
case 'RawHtml': | |
if(currE.html.valueOf() !== nextE.html.valueOf()) | |
{ | |
node.innerHTML = nextE.html; | |
} | |
updateProps(node, curr, next); | |
return rootNode; | |
case 'Image': | |
if (nextE._0.ctor === 'Plain') | |
{ | |
if (nextE._3 !== currE._3) | |
{ | |
node.src = nextE._3; | |
} | |
} | |
else if (!Utils.eq(nextE, currE) | |
|| next.props.width !== curr.props.width | |
|| next.props.height !== curr.props.height) | |
{ | |
return render(wrappedNext); | |
} | |
updateProps(node, curr, next); | |
return rootNode; | |
case 'Flow': | |
var arr = List.toArray(nextE._1); | |
for (var i = arr.length; i--; ) | |
{ | |
arr[i] = arr[i]._0.element.ctor; | |
} | |
if (nextE._0.ctor !== currE._0.ctor) | |
{ | |
return render(wrappedNext); | |
} | |
var nexts = List.toArray(nextE._1); | |
var kids = node.childNodes; | |
if (nexts.length !== kids.length) | |
{ | |
return render(wrappedNext); | |
} | |
var currs = List.toArray(currE._1); | |
var dir = nextE._0.ctor; | |
var goDir = directionTable[dir]; | |
var toReverse = needsReversal(dir); | |
var len = kids.length; | |
for (var i = len; i--; ) | |
{ | |
var subNode = kids[toReverse ? len - i - 1 : i]; | |
goDir(updateAndReplace(subNode, currs[i], nexts[i])); | |
} | |
updateProps(node, curr, next); | |
return rootNode; | |
case 'Container': | |
var subNode = node.firstChild; | |
var newSubNode = updateAndReplace(subNode, currE._1, nextE._1); | |
setPos(nextE._0, nextE._1, newSubNode); | |
updateProps(node, curr, next); | |
return rootNode; | |
case 'Custom': | |
if (currE.type === nextE.type) | |
{ | |
var updatedNode = nextE.update(node, currE.model, nextE.model); | |
updateProps(updatedNode, curr, next); | |
return updatedNode; | |
} | |
return render(wrappedNext); | |
} | |
} | |
function updateProps(node, curr, next) | |
{ | |
var nextProps = next.props; | |
var currProps = curr.props; | |
var element = next.element; | |
var width = nextProps.width - (element.adjustWidth || 0); | |
var height = nextProps.height - (element.adjustHeight || 0); | |
if (width !== currProps.width) | |
{ | |
node.style.width = (width | 0) + 'px'; | |
} | |
if (height !== currProps.height) | |
{ | |
node.style.height = (height | 0) + 'px'; | |
} | |
if (nextProps.opacity !== currProps.opacity) | |
{ | |
node.style.opacity = nextProps.opacity; | |
} | |
var nextColor = nextProps.color.ctor === 'Just' | |
? Color.toCss(nextProps.color._0) | |
: ''; | |
if (node.style.backgroundColor !== nextColor) | |
{ | |
node.style.backgroundColor = nextColor; | |
} | |
if (nextProps.tag !== currProps.tag) | |
{ | |
node.id = nextProps.tag; | |
} | |
if (nextProps.href !== currProps.href) | |
{ | |
if (currProps.href === '') | |
{ | |
// add a surrounding href | |
var anchor = createNode('a'); | |
anchor.href = nextProps.href; | |
anchor.style.display = 'block'; | |
anchor.style.pointerEvents = 'auto'; | |
node.parentNode.replaceChild(anchor, node); | |
anchor.appendChild(node); | |
} | |
else if (nextProps.href === '') | |
{ | |
// remove the surrounding href | |
var anchor = node.parentNode; | |
anchor.parentNode.replaceChild(node, anchor); | |
} | |
else | |
{ | |
// just update the link | |
node.parentNode.href = nextProps.href; | |
} | |
} | |
// update click and hover handlers | |
var removed = false; | |
// update hover handlers | |
if (currProps.hover.ctor === '_Tuple0') | |
{ | |
if (nextProps.hover.ctor !== '_Tuple0') | |
{ | |
addHover(node, nextProps.hover); | |
} | |
} | |
else | |
{ | |
if (nextProps.hover.ctor === '_Tuple0') | |
{ | |
removed = true; | |
removeHover(node); | |
} | |
else | |
{ | |
node.elm_hover_handler = nextProps.hover; | |
} | |
} | |
// update click handlers | |
if (currProps.click.ctor === '_Tuple0') | |
{ | |
if (nextProps.click.ctor !== '_Tuple0') | |
{ | |
addClick(node, nextProps.click); | |
} | |
} | |
else | |
{ | |
if (nextProps.click.ctor === '_Tuple0') | |
{ | |
removed = true; | |
removeClick(node); | |
} | |
else | |
{ | |
node.elm_click_handler = nextProps.click; | |
} | |
} | |
// stop capturing clicks if | |
if (removed | |
&& nextProps.hover.ctor === '_Tuple0' | |
&& nextProps.click.ctor === '_Tuple0') | |
{ | |
node.style.pointerEvents = 'none'; | |
} | |
} | |
// TEXT | |
function block(align) | |
{ | |
return function(text) | |
{ | |
var raw = { | |
ctor: 'RawHtml', | |
html: Text.renderHtml(text), | |
align: align | |
}; | |
var pos = htmlHeight(0, raw); | |
return newElement(pos._0, pos._1, raw); | |
}; | |
} | |
function markdown(text) | |
{ | |
var raw = { | |
ctor: 'RawHtml', | |
html: text, | |
align: null | |
}; | |
var pos = htmlHeight(0, raw); | |
return newElement(pos._0, pos._1, raw); | |
} | |
var htmlHeight = | |
typeof document !== 'undefined' | |
? realHtmlHeight | |
: function(a, b) { return Utils.Tuple2(0, 0); }; | |
function realHtmlHeight(width, rawHtml) | |
{ | |
// create dummy node | |
var temp = document.createElement('div'); | |
temp.innerHTML = rawHtml.html; | |
if (width > 0) | |
{ | |
temp.style.width = width + 'px'; | |
} | |
temp.style.visibility = 'hidden'; | |
temp.style.styleFloat = 'left'; | |
temp.style.cssFloat = 'left'; | |
document.body.appendChild(temp); | |
// get dimensions | |
var style = window.getComputedStyle(temp, null); | |
var w = Math.ceil(style.getPropertyValue('width').slice(0, -2) - 0); | |
var h = Math.ceil(style.getPropertyValue('height').slice(0, -2) - 0); | |
document.body.removeChild(temp); | |
return Utils.Tuple2(w, h); | |
} | |
return localRuntime.Native.Graphics.Element.values = { | |
render: render, | |
update: update, | |
updateAndReplace: updateAndReplace, | |
createNode: createNode, | |
newElement: F3(newElement), | |
addTransform: addTransform, | |
htmlHeight: F2(htmlHeight), | |
guid: Utils.guid, | |
block: block, | |
markdown: markdown | |
}; | |
}; | |
Elm.Native.Text = {}; | |
Elm.Native.Text.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Text = localRuntime.Native.Text || {}; | |
if (localRuntime.Native.Text.values) | |
{ | |
return localRuntime.Native.Text.values; | |
} | |
var toCss = Elm.Native.Color.make(localRuntime).toCss; | |
var List = Elm.Native.List.make(localRuntime); | |
// CONSTRUCTORS | |
function fromString(str) | |
{ | |
return { | |
ctor: 'Text:Text', | |
_0: str | |
}; | |
} | |
function append(a, b) | |
{ | |
return { | |
ctor: 'Text:Append', | |
_0: a, | |
_1: b | |
}; | |
} | |
function addMeta(field, value, text) | |
{ | |
var newProps = {}; | |
var newText = { | |
ctor: 'Text:Meta', | |
_0: newProps, | |
_1: text | |
}; | |
if (text.ctor === 'Text:Meta') | |
{ | |
newText._1 = text._1; | |
var props = text._0; | |
for (var i = metaKeys.length; i--; ) | |
{ | |
var key = metaKeys[i]; | |
var val = props[key]; | |
if (val) | |
{ | |
newProps[key] = val; | |
} | |
} | |
} | |
newProps[field] = value; | |
return newText; | |
} | |
var metaKeys = [ | |
'font-size', | |
'font-family', | |
'font-style', | |
'font-weight', | |
'href', | |
'text-decoration', | |
'color' | |
]; | |
// conversions from Elm values to CSS | |
function toTypefaces(list) | |
{ | |
var typefaces = List.toArray(list); | |
for (var i = typefaces.length; i--; ) | |
{ | |
var typeface = typefaces[i]; | |
if (typeface.indexOf(' ') > -1) | |
{ | |
typefaces[i] = "'" + typeface + "'"; | |
} | |
} | |
return typefaces.join(','); | |
} | |
function toLine(line) | |
{ | |
var ctor = line.ctor; | |
return ctor === 'Under' | |
? 'underline' | |
: ctor === 'Over' | |
? 'overline' | |
: 'line-through'; | |
} | |
// setting styles of Text | |
function style(style, text) | |
{ | |
var newText = addMeta('color', toCss(style.color), text); | |
var props = newText._0; | |
if (style.typeface.ctor !== '[]') | |
{ | |
props['font-family'] = toTypefaces(style.typeface); | |
} | |
if (style.height.ctor !== 'Nothing') | |
{ | |
props['font-size'] = style.height._0 + 'px'; | |
} | |
if (style.bold) | |
{ | |
props['font-weight'] = 'bold'; | |
} | |
if (style.italic) | |
{ | |
props['font-style'] = 'italic'; | |
} | |
if (style.line.ctor !== 'Nothing') | |
{ | |
props['text-decoration'] = toLine(style.line._0); | |
} | |
return newText; | |
} | |
function height(px, text) | |
{ | |
return addMeta('font-size', px + 'px', text); | |
} | |
function typeface(names, text) | |
{ | |
return addMeta('font-family', toTypefaces(names), text); | |
} | |
function monospace(text) | |
{ | |
return addMeta('font-family', 'monospace', text); | |
} | |
function italic(text) | |
{ | |
return addMeta('font-style', 'italic', text); | |
} | |
function bold(text) | |
{ | |
return addMeta('font-weight', 'bold', text); | |
} | |
function link(href, text) | |
{ | |
return addMeta('href', href, text); | |
} | |
function line(line, text) | |
{ | |
return addMeta('text-decoration', toLine(line), text); | |
} | |
function color(color, text) | |
{ | |
return addMeta('color', toCss(color), text); | |
} | |
// RENDER | |
function renderHtml(text) | |
{ | |
var tag = text.ctor; | |
if (tag === 'Text:Append') | |
{ | |
return renderHtml(text._0) + renderHtml(text._1); | |
} | |
if (tag === 'Text:Text') | |
{ | |
return properEscape(text._0); | |
} | |
if (tag === 'Text:Meta') | |
{ | |
return renderMeta(text._0, renderHtml(text._1)); | |
} | |
} | |
function renderMeta(metas, string) | |
{ | |
var href = metas.href; | |
if (href) | |
{ | |
string = '<a href="' + href + '">' + string + '</a>'; | |
} | |
var styles = ''; | |
for (var key in metas) | |
{ | |
if (key === 'href') | |
{ | |
continue; | |
} | |
styles += key + ':' + metas[key] + ';'; | |
} | |
if (styles) | |
{ | |
string = '<span style="' + styles + '">' + string + '</span>'; | |
} | |
return string; | |
} | |
function properEscape(str) | |
{ | |
if (str.length === 0) | |
{ | |
return str; | |
} | |
str = str //.replace(/&/g, '&') | |
.replace(/"/g, '"') | |
.replace(/'/g, ''') | |
.replace(/</g, '<') | |
.replace(/>/g, '>'); | |
var arr = str.split('\n'); | |
for (var i = arr.length; i--; ) | |
{ | |
arr[i] = makeSpaces(arr[i]); | |
} | |
return arr.join('<br/>'); | |
} | |
function makeSpaces(s) | |
{ | |
if (s.length === 0) | |
{ | |
return s; | |
} | |
var arr = s.split(''); | |
if (arr[0] === ' ') | |
{ | |
arr[0] = ' '; | |
} | |
for (var i = arr.length; --i; ) | |
{ | |
if (arr[i][0] === ' ' && arr[i - 1] === ' ') | |
{ | |
arr[i - 1] = arr[i - 1] + arr[i]; | |
arr[i] = ''; | |
} | |
} | |
for (var i = arr.length; i--; ) | |
{ | |
if (arr[i].length > 1 && arr[i][0] === ' ') | |
{ | |
var spaces = arr[i].split(''); | |
for (var j = spaces.length - 2; j >= 0; j -= 2) | |
{ | |
spaces[j] = ' '; | |
} | |
arr[i] = spaces.join(''); | |
} | |
} | |
arr = arr.join(''); | |
if (arr[arr.length - 1] === ' ') | |
{ | |
return arr.slice(0, -1) + ' '; | |
} | |
return arr; | |
} | |
return localRuntime.Native.Text.values = { | |
fromString: fromString, | |
append: F2(append), | |
height: F2(height), | |
italic: italic, | |
bold: bold, | |
line: F2(line), | |
monospace: monospace, | |
typeface: F2(typeface), | |
color: F2(color), | |
link: F2(link), | |
style: F2(style), | |
toTypefaces: toTypefaces, | |
toLine: toLine, | |
renderHtml: renderHtml | |
}; | |
}; | |
Elm.Text = Elm.Text || {}; | |
Elm.Text.make = function (_elm) { | |
"use strict"; | |
_elm.Text = _elm.Text || {}; | |
if (_elm.Text.values) return _elm.Text.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Color = Elm.Color.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Native$Text = Elm.Native.Text.make(_elm); | |
var _op = {}; | |
var line = $Native$Text.line; | |
var italic = $Native$Text.italic; | |
var bold = $Native$Text.bold; | |
var color = $Native$Text.color; | |
var height = $Native$Text.height; | |
var link = $Native$Text.link; | |
var monospace = $Native$Text.monospace; | |
var typeface = $Native$Text.typeface; | |
var style = $Native$Text.style; | |
var append = $Native$Text.append; | |
var fromString = $Native$Text.fromString; | |
var empty = fromString(""); | |
var concat = function (texts) { | |
return A3($List.foldr,append,empty,texts); | |
}; | |
var join = F2(function (seperator,texts) { | |
return concat(A2($List.intersperse,seperator,texts)); | |
}); | |
var defaultStyle = {typeface: _U.list([]) | |
,height: $Maybe.Nothing | |
,color: $Color.black | |
,bold: false | |
,italic: false | |
,line: $Maybe.Nothing}; | |
var Style = F6(function (a,b,c,d,e,f) { | |
return {typeface: a | |
,height: b | |
,color: c | |
,bold: d | |
,italic: e | |
,line: f}; | |
}); | |
var Through = {ctor: "Through"}; | |
var Over = {ctor: "Over"}; | |
var Under = {ctor: "Under"}; | |
var Text = {ctor: "Text"}; | |
return _elm.Text.values = {_op: _op | |
,fromString: fromString | |
,empty: empty | |
,append: append | |
,concat: concat | |
,join: join | |
,link: link | |
,style: style | |
,defaultStyle: defaultStyle | |
,typeface: typeface | |
,monospace: monospace | |
,height: height | |
,color: color | |
,bold: bold | |
,italic: italic | |
,line: line | |
,Style: Style | |
,Under: Under | |
,Over: Over | |
,Through: Through}; | |
}; | |
Elm.Graphics = Elm.Graphics || {}; | |
Elm.Graphics.Element = Elm.Graphics.Element || {}; | |
Elm.Graphics.Element.make = function (_elm) { | |
"use strict"; | |
_elm.Graphics = _elm.Graphics || {}; | |
_elm.Graphics.Element = _elm.Graphics.Element || {}; | |
if (_elm.Graphics.Element.values) | |
return _elm.Graphics.Element.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Color = Elm.Color.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Native$Graphics$Element = Elm.Native.Graphics.Element.make(_elm), | |
$Text = Elm.Text.make(_elm); | |
var _op = {}; | |
var DOut = {ctor: "DOut"}; | |
var outward = DOut; | |
var DIn = {ctor: "DIn"}; | |
var inward = DIn; | |
var DRight = {ctor: "DRight"}; | |
var right = DRight; | |
var DLeft = {ctor: "DLeft"}; | |
var left = DLeft; | |
var DDown = {ctor: "DDown"}; | |
var down = DDown; | |
var DUp = {ctor: "DUp"}; | |
var up = DUp; | |
var RawPosition = F4(function (a,b,c,d) { | |
return {horizontal: a,vertical: b,x: c,y: d}; | |
}); | |
var Position = function (a) { | |
return {ctor: "Position",_0: a}; | |
}; | |
var Relative = function (a) { | |
return {ctor: "Relative",_0: a}; | |
}; | |
var relative = Relative; | |
var Absolute = function (a) { | |
return {ctor: "Absolute",_0: a}; | |
}; | |
var absolute = Absolute; | |
var N = {ctor: "N"}; | |
var bottomLeft = Position({horizontal: N | |
,vertical: N | |
,x: Absolute(0) | |
,y: Absolute(0)}); | |
var bottomLeftAt = F2(function (x,y) { | |
return Position({horizontal: N,vertical: N,x: x,y: y}); | |
}); | |
var Z = {ctor: "Z"}; | |
var middle = Position({horizontal: Z | |
,vertical: Z | |
,x: Relative(0.5) | |
,y: Relative(0.5)}); | |
var midLeft = Position({horizontal: N | |
,vertical: Z | |
,x: Absolute(0) | |
,y: Relative(0.5)}); | |
var midBottom = Position({horizontal: Z | |
,vertical: N | |
,x: Relative(0.5) | |
,y: Absolute(0)}); | |
var middleAt = F2(function (x,y) { | |
return Position({horizontal: Z,vertical: Z,x: x,y: y}); | |
}); | |
var midLeftAt = F2(function (x,y) { | |
return Position({horizontal: N,vertical: Z,x: x,y: y}); | |
}); | |
var midBottomAt = F2(function (x,y) { | |
return Position({horizontal: Z,vertical: N,x: x,y: y}); | |
}); | |
var P = {ctor: "P"}; | |
var topLeft = Position({horizontal: N | |
,vertical: P | |
,x: Absolute(0) | |
,y: Absolute(0)}); | |
var topRight = Position({horizontal: P | |
,vertical: P | |
,x: Absolute(0) | |
,y: Absolute(0)}); | |
var bottomRight = Position({horizontal: P | |
,vertical: N | |
,x: Absolute(0) | |
,y: Absolute(0)}); | |
var midRight = Position({horizontal: P | |
,vertical: Z | |
,x: Absolute(0) | |
,y: Relative(0.5)}); | |
var midTop = Position({horizontal: Z | |
,vertical: P | |
,x: Relative(0.5) | |
,y: Absolute(0)}); | |
var topLeftAt = F2(function (x,y) { | |
return Position({horizontal: N,vertical: P,x: x,y: y}); | |
}); | |
var topRightAt = F2(function (x,y) { | |
return Position({horizontal: P,vertical: P,x: x,y: y}); | |
}); | |
var bottomRightAt = F2(function (x,y) { | |
return Position({horizontal: P,vertical: N,x: x,y: y}); | |
}); | |
var midRightAt = F2(function (x,y) { | |
return Position({horizontal: P,vertical: Z,x: x,y: y}); | |
}); | |
var midTopAt = F2(function (x,y) { | |
return Position({horizontal: Z,vertical: P,x: x,y: y}); | |
}); | |
var justified = $Native$Graphics$Element.block("justify"); | |
var centered = $Native$Graphics$Element.block("center"); | |
var rightAligned = $Native$Graphics$Element.block("right"); | |
var leftAligned = $Native$Graphics$Element.block("left"); | |
var show = function (value) { | |
return leftAligned($Text.monospace($Text.fromString($Basics.toString(value)))); | |
}; | |
var Tiled = {ctor: "Tiled"}; | |
var Cropped = function (a) { | |
return {ctor: "Cropped",_0: a}; | |
}; | |
var Fitted = {ctor: "Fitted"}; | |
var Plain = {ctor: "Plain"}; | |
var Custom = {ctor: "Custom"}; | |
var RawHtml = {ctor: "RawHtml"}; | |
var Spacer = {ctor: "Spacer"}; | |
var Flow = F2(function (a,b) { | |
return {ctor: "Flow",_0: a,_1: b}; | |
}); | |
var Container = F2(function (a,b) { | |
return {ctor: "Container",_0: a,_1: b}; | |
}); | |
var Image = F4(function (a,b,c,d) { | |
return {ctor: "Image",_0: a,_1: b,_2: c,_3: d}; | |
}); | |
var newElement = $Native$Graphics$Element.newElement; | |
var image = F3(function (w,h,src) { | |
return A3(newElement,w,h,A4(Image,Plain,w,h,src)); | |
}); | |
var fittedImage = F3(function (w,h,src) { | |
return A3(newElement,w,h,A4(Image,Fitted,w,h,src)); | |
}); | |
var croppedImage = F4(function (pos,w,h,src) { | |
return A3(newElement,w,h,A4(Image,Cropped(pos),w,h,src)); | |
}); | |
var tiledImage = F3(function (w,h,src) { | |
return A3(newElement,w,h,A4(Image,Tiled,w,h,src)); | |
}); | |
var container = F4(function (w,h,_p0,e) { | |
var _p1 = _p0; | |
return A3(newElement,w,h,A2(Container,_p1._0,e)); | |
}); | |
var spacer = F2(function (w,h) { | |
return A3(newElement,w,h,Spacer); | |
}); | |
var sizeOf = function (_p2) { | |
var _p3 = _p2; | |
var _p4 = _p3._0; | |
return {ctor: "_Tuple2" | |
,_0: _p4.props.width | |
,_1: _p4.props.height}; | |
}; | |
var heightOf = function (_p5) { | |
var _p6 = _p5; | |
return _p6._0.props.height; | |
}; | |
var widthOf = function (_p7) { | |
var _p8 = _p7; | |
return _p8._0.props.width; | |
}; | |
var above = F2(function (hi,lo) { | |
return A3(newElement, | |
A2($Basics.max,widthOf(hi),widthOf(lo)), | |
heightOf(hi) + heightOf(lo), | |
A2(Flow,DDown,_U.list([hi,lo]))); | |
}); | |
var below = F2(function (lo,hi) { | |
return A3(newElement, | |
A2($Basics.max,widthOf(hi),widthOf(lo)), | |
heightOf(hi) + heightOf(lo), | |
A2(Flow,DDown,_U.list([hi,lo]))); | |
}); | |
var beside = F2(function (lft,rht) { | |
return A3(newElement, | |
widthOf(lft) + widthOf(rht), | |
A2($Basics.max,heightOf(lft),heightOf(rht)), | |
A2(Flow,right,_U.list([lft,rht]))); | |
}); | |
var layers = function (es) { | |
var hs = A2($List.map,heightOf,es); | |
var ws = A2($List.map,widthOf,es); | |
return A3(newElement, | |
A2($Maybe.withDefault,0,$List.maximum(ws)), | |
A2($Maybe.withDefault,0,$List.maximum(hs)), | |
A2(Flow,DOut,es)); | |
}; | |
var empty = A2(spacer,0,0); | |
var flow = F2(function (dir,es) { | |
var newFlow = F2(function (w,h) { | |
return A3(newElement,w,h,A2(Flow,dir,es)); | |
}); | |
var maxOrZero = function (list) { | |
return A2($Maybe.withDefault,0,$List.maximum(list)); | |
}; | |
var hs = A2($List.map,heightOf,es); | |
var ws = A2($List.map,widthOf,es); | |
if (_U.eq(es,_U.list([]))) return empty; else { | |
var _p9 = dir; | |
switch (_p9.ctor) | |
{case "DUp": return A2(newFlow,maxOrZero(ws),$List.sum(hs)); | |
case "DDown": return A2(newFlow,maxOrZero(ws),$List.sum(hs)); | |
case "DLeft": return A2(newFlow,$List.sum(ws),maxOrZero(hs)); | |
case "DRight": return A2(newFlow,$List.sum(ws),maxOrZero(hs)); | |
case "DIn": return A2(newFlow,maxOrZero(ws),maxOrZero(hs)); | |
default: return A2(newFlow,maxOrZero(ws),maxOrZero(hs));} | |
} | |
}); | |
var Properties = F9(function (a,b,c,d,e,f,g,h,i) { | |
return {id: a | |
,width: b | |
,height: c | |
,opacity: d | |
,color: e | |
,href: f | |
,tag: g | |
,hover: h | |
,click: i}; | |
}); | |
var Element_elm_builtin = function (a) { | |
return {ctor: "Element_elm_builtin",_0: a}; | |
}; | |
var width = F2(function (newWidth,_p10) { | |
var _p11 = _p10; | |
var _p14 = _p11._0.props; | |
var _p13 = _p11._0.element; | |
var newHeight = function () { | |
var _p12 = _p13; | |
switch (_p12.ctor) | |
{case "Image": | |
return $Basics.round($Basics.toFloat(_p12._2) / $Basics.toFloat(_p12._1) * $Basics.toFloat(newWidth)); | |
case "RawHtml": | |
return $Basics.snd(A2($Native$Graphics$Element.htmlHeight, | |
newWidth, | |
_p13)); | |
default: return _p14.height;} | |
}(); | |
return Element_elm_builtin({element: _p13 | |
,props: _U.update(_p14,{width: newWidth,height: newHeight})}); | |
}); | |
var height = F2(function (newHeight,_p15) { | |
var _p16 = _p15; | |
return Element_elm_builtin({element: _p16._0.element | |
,props: _U.update(_p16._0.props,{height: newHeight})}); | |
}); | |
var size = F3(function (w,h,e) { | |
return A2(height,h,A2(width,w,e)); | |
}); | |
var opacity = F2(function (givenOpacity,_p17) { | |
var _p18 = _p17; | |
return Element_elm_builtin({element: _p18._0.element | |
,props: _U.update(_p18._0.props,{opacity: givenOpacity})}); | |
}); | |
var color = F2(function (clr,_p19) { | |
var _p20 = _p19; | |
return Element_elm_builtin({element: _p20._0.element | |
,props: _U.update(_p20._0.props,{color: $Maybe.Just(clr)})}); | |
}); | |
var tag = F2(function (name,_p21) { | |
var _p22 = _p21; | |
return Element_elm_builtin({element: _p22._0.element | |
,props: _U.update(_p22._0.props,{tag: name})}); | |
}); | |
var link = F2(function (href,_p23) { | |
var _p24 = _p23; | |
return Element_elm_builtin({element: _p24._0.element | |
,props: _U.update(_p24._0.props,{href: href})}); | |
}); | |
return _elm.Graphics.Element.values = {_op: _op | |
,image: image | |
,fittedImage: fittedImage | |
,croppedImage: croppedImage | |
,tiledImage: tiledImage | |
,leftAligned: leftAligned | |
,rightAligned: rightAligned | |
,centered: centered | |
,justified: justified | |
,show: show | |
,width: width | |
,height: height | |
,size: size | |
,color: color | |
,opacity: opacity | |
,link: link | |
,tag: tag | |
,widthOf: widthOf | |
,heightOf: heightOf | |
,sizeOf: sizeOf | |
,flow: flow | |
,up: up | |
,down: down | |
,left: left | |
,right: right | |
,inward: inward | |
,outward: outward | |
,layers: layers | |
,above: above | |
,below: below | |
,beside: beside | |
,empty: empty | |
,spacer: spacer | |
,container: container | |
,middle: middle | |
,midTop: midTop | |
,midBottom: midBottom | |
,midLeft: midLeft | |
,midRight: midRight | |
,topLeft: topLeft | |
,topRight: topRight | |
,bottomLeft: bottomLeft | |
,bottomRight: bottomRight | |
,absolute: absolute | |
,relative: relative | |
,middleAt: middleAt | |
,midTopAt: midTopAt | |
,midBottomAt: midBottomAt | |
,midLeftAt: midLeftAt | |
,midRightAt: midRightAt | |
,topLeftAt: topLeftAt | |
,topRightAt: topRightAt | |
,bottomLeftAt: bottomLeftAt | |
,bottomRightAt: bottomRightAt}; | |
}; | |
Elm.Graphics = Elm.Graphics || {}; | |
Elm.Graphics.Collage = Elm.Graphics.Collage || {}; | |
Elm.Graphics.Collage.make = function (_elm) { | |
"use strict"; | |
_elm.Graphics = _elm.Graphics || {}; | |
_elm.Graphics.Collage = _elm.Graphics.Collage || {}; | |
if (_elm.Graphics.Collage.values) | |
return _elm.Graphics.Collage.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Color = Elm.Color.make(_elm), | |
$Graphics$Element = Elm.Graphics.Element.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Native$Graphics$Collage = Elm.Native.Graphics.Collage.make(_elm), | |
$Text = Elm.Text.make(_elm), | |
$Transform2D = Elm.Transform2D.make(_elm); | |
var _op = {}; | |
var Shape = function (a) { return {ctor: "Shape",_0: a};}; | |
var polygon = function (points) { return Shape(points);}; | |
var rect = F2(function (w,h) { | |
var hh = h / 2; | |
var hw = w / 2; | |
return Shape(_U.list([{ctor: "_Tuple2",_0: 0 - hw,_1: 0 - hh} | |
,{ctor: "_Tuple2",_0: 0 - hw,_1: hh} | |
,{ctor: "_Tuple2",_0: hw,_1: hh} | |
,{ctor: "_Tuple2",_0: hw,_1: 0 - hh}])); | |
}); | |
var square = function (n) { return A2(rect,n,n);}; | |
var oval = F2(function (w,h) { | |
var hh = h / 2; | |
var hw = w / 2; | |
var n = 50; | |
var t = 2 * $Basics.pi / n; | |
var f = function (i) { | |
return {ctor: "_Tuple2" | |
,_0: hw * $Basics.cos(t * i) | |
,_1: hh * $Basics.sin(t * i)}; | |
}; | |
return Shape(A2($List.map,f,_U.range(0,n - 1))); | |
}); | |
var circle = function (r) { return A2(oval,2 * r,2 * r);}; | |
var ngon = F2(function (n,r) { | |
var m = $Basics.toFloat(n); | |
var t = 2 * $Basics.pi / m; | |
var f = function (i) { | |
return {ctor: "_Tuple2" | |
,_0: r * $Basics.cos(t * i) | |
,_1: r * $Basics.sin(t * i)}; | |
}; | |
return Shape(A2($List.map,f,_U.range(0,m - 1))); | |
}); | |
var Path = function (a) { return {ctor: "Path",_0: a};}; | |
var path = function (ps) { return Path(ps);}; | |
var segment = F2(function (p1,p2) { | |
return Path(_U.list([p1,p2])); | |
}); | |
var collage = $Native$Graphics$Collage.collage; | |
var Fill = function (a) { return {ctor: "Fill",_0: a};}; | |
var Line = function (a) { return {ctor: "Line",_0: a};}; | |
var FGroup = F2(function (a,b) { | |
return {ctor: "FGroup",_0: a,_1: b}; | |
}); | |
var FElement = function (a) { | |
return {ctor: "FElement",_0: a}; | |
}; | |
var FImage = F4(function (a,b,c,d) { | |
return {ctor: "FImage",_0: a,_1: b,_2: c,_3: d}; | |
}); | |
var FText = function (a) { return {ctor: "FText",_0: a};}; | |
var FOutlinedText = F2(function (a,b) { | |
return {ctor: "FOutlinedText",_0: a,_1: b}; | |
}); | |
var FShape = F2(function (a,b) { | |
return {ctor: "FShape",_0: a,_1: b}; | |
}); | |
var FPath = F2(function (a,b) { | |
return {ctor: "FPath",_0: a,_1: b}; | |
}); | |
var LineStyle = F6(function (a,b,c,d,e,f) { | |
return {color: a | |
,width: b | |
,cap: c | |
,join: d | |
,dashing: e | |
,dashOffset: f}; | |
}); | |
var Clipped = {ctor: "Clipped"}; | |
var Sharp = function (a) { return {ctor: "Sharp",_0: a};}; | |
var Smooth = {ctor: "Smooth"}; | |
var Padded = {ctor: "Padded"}; | |
var Round = {ctor: "Round"}; | |
var Flat = {ctor: "Flat"}; | |
var defaultLine = {color: $Color.black | |
,width: 1 | |
,cap: Flat | |
,join: Sharp(10) | |
,dashing: _U.list([]) | |
,dashOffset: 0}; | |
var solid = function (clr) { | |
return _U.update(defaultLine,{color: clr}); | |
}; | |
var dashed = function (clr) { | |
return _U.update(defaultLine, | |
{color: clr,dashing: _U.list([8,4])}); | |
}; | |
var dotted = function (clr) { | |
return _U.update(defaultLine, | |
{color: clr,dashing: _U.list([3,3])}); | |
}; | |
var Grad = function (a) { return {ctor: "Grad",_0: a};}; | |
var Texture = function (a) { | |
return {ctor: "Texture",_0: a}; | |
}; | |
var Solid = function (a) { return {ctor: "Solid",_0: a};}; | |
var Form_elm_builtin = function (a) { | |
return {ctor: "Form_elm_builtin",_0: a}; | |
}; | |
var form = function (f) { | |
return Form_elm_builtin({theta: 0 | |
,scale: 1 | |
,x: 0 | |
,y: 0 | |
,alpha: 1 | |
,form: f}); | |
}; | |
var fill = F2(function (style,_p0) { | |
var _p1 = _p0; | |
return form(A2(FShape,Fill(style),_p1._0)); | |
}); | |
var filled = F2(function (color,shape) { | |
return A2(fill,Solid(color),shape); | |
}); | |
var textured = F2(function (src,shape) { | |
return A2(fill,Texture(src),shape); | |
}); | |
var gradient = F2(function (grad,shape) { | |
return A2(fill,Grad(grad),shape); | |
}); | |
var outlined = F2(function (style,_p2) { | |
var _p3 = _p2; | |
return form(A2(FShape,Line(style),_p3._0)); | |
}); | |
var traced = F2(function (style,_p4) { | |
var _p5 = _p4; | |
return form(A2(FPath,style,_p5._0)); | |
}); | |
var sprite = F4(function (w,h,pos,src) { | |
return form(A4(FImage,w,h,pos,src)); | |
}); | |
var toForm = function (e) { return form(FElement(e));}; | |
var group = function (fs) { | |
return form(A2(FGroup,$Transform2D.identity,fs)); | |
}; | |
var groupTransform = F2(function (matrix,fs) { | |
return form(A2(FGroup,matrix,fs)); | |
}); | |
var text = function (t) { return form(FText(t));}; | |
var outlinedText = F2(function (ls,t) { | |
return form(A2(FOutlinedText,ls,t)); | |
}); | |
var move = F2(function (_p7,_p6) { | |
var _p8 = _p7; | |
var _p9 = _p6; | |
var _p10 = _p9._0; | |
return Form_elm_builtin(_U.update(_p10, | |
{x: _p10.x + _p8._0,y: _p10.y + _p8._1})); | |
}); | |
var moveX = F2(function (x,_p11) { | |
var _p12 = _p11; | |
var _p13 = _p12._0; | |
return Form_elm_builtin(_U.update(_p13,{x: _p13.x + x})); | |
}); | |
var moveY = F2(function (y,_p14) { | |
var _p15 = _p14; | |
var _p16 = _p15._0; | |
return Form_elm_builtin(_U.update(_p16,{y: _p16.y + y})); | |
}); | |
var scale = F2(function (s,_p17) { | |
var _p18 = _p17; | |
var _p19 = _p18._0; | |
return Form_elm_builtin(_U.update(_p19, | |
{scale: _p19.scale * s})); | |
}); | |
var rotate = F2(function (t,_p20) { | |
var _p21 = _p20; | |
var _p22 = _p21._0; | |
return Form_elm_builtin(_U.update(_p22, | |
{theta: _p22.theta + t})); | |
}); | |
var alpha = F2(function (a,_p23) { | |
var _p24 = _p23; | |
return Form_elm_builtin(_U.update(_p24._0,{alpha: a})); | |
}); | |
return _elm.Graphics.Collage.values = {_op: _op | |
,collage: collage | |
,toForm: toForm | |
,filled: filled | |
,textured: textured | |
,gradient: gradient | |
,outlined: outlined | |
,traced: traced | |
,text: text | |
,outlinedText: outlinedText | |
,move: move | |
,moveX: moveX | |
,moveY: moveY | |
,scale: scale | |
,rotate: rotate | |
,alpha: alpha | |
,group: group | |
,groupTransform: groupTransform | |
,rect: rect | |
,oval: oval | |
,square: square | |
,circle: circle | |
,ngon: ngon | |
,polygon: polygon | |
,segment: segment | |
,path: path | |
,solid: solid | |
,dashed: dashed | |
,dotted: dotted | |
,defaultLine: defaultLine | |
,LineStyle: LineStyle | |
,Flat: Flat | |
,Round: Round | |
,Padded: Padded | |
,Smooth: Smooth | |
,Sharp: Sharp | |
,Clipped: Clipped}; | |
}; | |
Elm.Native.Debug = {}; | |
Elm.Native.Debug.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Debug = localRuntime.Native.Debug || {}; | |
if (localRuntime.Native.Debug.values) | |
{ | |
return localRuntime.Native.Debug.values; | |
} | |
var toString = Elm.Native.Utils.make(localRuntime).toString; | |
function log(tag, value) | |
{ | |
var msg = tag + ': ' + 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); | |
} | |
function tracePath(tag, form) | |
{ | |
if (localRuntime.debug) | |
{ | |
return localRuntime.debug.trace(tag, form); | |
} | |
return form; | |
} | |
function watch(tag, value) | |
{ | |
if (localRuntime.debug) | |
{ | |
localRuntime.debug.watch(tag, value); | |
} | |
return value; | |
} | |
function watchSummary(tag, summarize, value) | |
{ | |
if (localRuntime.debug) | |
{ | |
localRuntime.debug.watch(tag, summarize(value)); | |
} | |
return value; | |
} | |
return localRuntime.Native.Debug.values = { | |
crash: crash, | |
tracePath: F2(tracePath), | |
log: F2(log), | |
watch: F2(watch), | |
watchSummary: F3(watchSummary) | |
}; | |
}; | |
Elm.Debug = Elm.Debug || {}; | |
Elm.Debug.make = function (_elm) { | |
"use strict"; | |
_elm.Debug = _elm.Debug || {}; | |
if (_elm.Debug.values) return _elm.Debug.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Graphics$Collage = Elm.Graphics.Collage.make(_elm), | |
$Native$Debug = Elm.Native.Debug.make(_elm); | |
var _op = {}; | |
var trace = $Native$Debug.tracePath; | |
var watchSummary = $Native$Debug.watchSummary; | |
var watch = $Native$Debug.watch; | |
var crash = $Native$Debug.crash; | |
var log = $Native$Debug.log; | |
return _elm.Debug.values = {_op: _op | |
,log: log | |
,crash: crash | |
,watch: watch | |
,watchSummary: watchSummary | |
,trace: trace}; | |
}; | |
Elm.Native.Task = {}; | |
Elm.Native.Task.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Task = localRuntime.Native.Task || {}; | |
if (localRuntime.Native.Task.values) | |
{ | |
return localRuntime.Native.Task.values; | |
} | |
var Result = Elm.Result.make(localRuntime); | |
var Signal; | |
var Utils = Elm.Native.Utils.make(localRuntime); | |
// CONSTRUCTORS | |
function succeed(value) | |
{ | |
return { | |
tag: 'Succeed', | |
value: value | |
}; | |
} | |
function fail(error) | |
{ | |
return { | |
tag: 'Fail', | |
value: error | |
}; | |
} | |
function asyncFunction(func) | |
{ | |
return { | |
tag: 'Async', | |
asyncFunction: func | |
}; | |
} | |
function andThen(task, callback) | |
{ | |
return { | |
tag: 'AndThen', | |
task: task, | |
callback: callback | |
}; | |
} | |
function catch_(task, callback) | |
{ | |
return { | |
tag: 'Catch', | |
task: task, | |
callback: callback | |
}; | |
} | |
// RUNNER | |
function perform(task) { | |
runTask({ task: task }, function() {}); | |
} | |
function performSignal(name, signal) | |
{ | |
var workQueue = []; | |
function onComplete() | |
{ | |
workQueue.shift(); | |
if (workQueue.length > 0) | |
{ | |
var task = workQueue[0]; | |
setTimeout(function() { | |
runTask(task, onComplete); | |
}, 0); | |
} | |
} | |
function register(task) | |
{ | |
var root = { task: task }; | |
workQueue.push(root); | |
if (workQueue.length === 1) | |
{ | |
runTask(root, onComplete); | |
} | |
} | |
if (!Signal) | |
{ | |
Signal = Elm.Native.Signal.make(localRuntime); | |
} | |
Signal.output('perform-tasks-' + name, register, signal); | |
register(signal.value); | |
return signal; | |
} | |
function mark(status, task) | |
{ | |
return { status: status, task: task }; | |
} | |
function runTask(root, onComplete) | |
{ | |
var result = mark('runnable', root.task); | |
while (result.status === 'runnable') | |
{ | |
result = stepTask(onComplete, root, result.task); | |
} | |
if (result.status === 'done') | |
{ | |
root.task = result.task; | |
onComplete(); | |
} | |
if (result.status === 'blocked') | |
{ | |
root.task = result.task; | |
} | |
} | |
function stepTask(onComplete, root, task) | |
{ | |
var tag = task.tag; | |
if (tag === 'Succeed' || tag === 'Fail') | |
{ | |
return mark('done', task); | |
} | |
if (tag === 'Async') | |
{ | |
var placeHolder = {}; | |
var couldBeSync = true; | |
var wasSync = false; | |
task.asyncFunction(function(result) { | |
placeHolder.tag = result.tag; | |
placeHolder.value = result.value; | |
if (couldBeSync) | |
{ | |
wasSync = true; | |
} | |
else | |
{ | |
runTask(root, onComplete); | |
} | |
}); | |
couldBeSync = false; | |
return mark(wasSync ? 'done' : 'blocked', placeHolder); | |
} | |
if (tag === 'AndThen' || tag === 'Catch') | |
{ | |
var result = mark('runnable', task.task); | |
while (result.status === 'runnable') | |
{ | |
result = stepTask(onComplete, root, result.task); | |
} | |
if (result.status === 'done') | |
{ | |
var activeTask = result.task; | |
var activeTag = activeTask.tag; | |
var succeedChain = activeTag === 'Succeed' && tag === 'AndThen'; | |
var failChain = activeTag === 'Fail' && tag === 'Catch'; | |
return (succeedChain || failChain) | |
? mark('runnable', task.callback(activeTask.value)) | |
: mark('runnable', activeTask); | |
} | |
if (result.status === 'blocked') | |
{ | |
return mark('blocked', { | |
tag: tag, | |
task: result.task, | |
callback: task.callback | |
}); | |
} | |
} | |
} | |
// THREADS | |
function sleep(time) { | |
return asyncFunction(function(callback) { | |
setTimeout(function() { | |
callback(succeed(Utils.Tuple0)); | |
}, time); | |
}); | |
} | |
function spawn(task) { | |
return asyncFunction(function(callback) { | |
var id = setTimeout(function() { | |
perform(task); | |
}, 0); | |
callback(succeed(id)); | |
}); | |
} | |
return localRuntime.Native.Task.values = { | |
succeed: succeed, | |
fail: fail, | |
asyncFunction: asyncFunction, | |
andThen: F2(andThen), | |
catch_: F2(catch_), | |
perform: perform, | |
performSignal: performSignal, | |
spawn: spawn, | |
sleep: sleep | |
}; | |
}; | |
Elm.Result = Elm.Result || {}; | |
Elm.Result.make = function (_elm) { | |
"use strict"; | |
_elm.Result = _elm.Result || {}; | |
if (_elm.Result.values) return _elm.Result.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm); | |
var _op = {}; | |
var toMaybe = function (result) { | |
var _p0 = result; | |
if (_p0.ctor === "Ok") { | |
return $Maybe.Just(_p0._0); | |
} else { | |
return $Maybe.Nothing; | |
} | |
}; | |
var withDefault = F2(function (def,result) { | |
var _p1 = result; | |
if (_p1.ctor === "Ok") { | |
return _p1._0; | |
} else { | |
return def; | |
} | |
}); | |
var Err = function (a) { return {ctor: "Err",_0: a};}; | |
var andThen = F2(function (result,callback) { | |
var _p2 = result; | |
if (_p2.ctor === "Ok") { | |
return callback(_p2._0); | |
} else { | |
return Err(_p2._0); | |
} | |
}); | |
var Ok = function (a) { return {ctor: "Ok",_0: a};}; | |
var map = F2(function (func,ra) { | |
var _p3 = ra; | |
if (_p3.ctor === "Ok") { | |
return Ok(func(_p3._0)); | |
} else { | |
return Err(_p3._0); | |
} | |
}); | |
var 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 Ok(A2(func,_p4._0._0,_p4._1._0)); | |
} else { | |
return Err(_p4._1._0); | |
} | |
} else { | |
return Err(_p4._0._0); | |
} | |
}); | |
var 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 Ok(A3(func,_p5._0._0,_p5._1._0,_p5._2._0)); | |
} else { | |
return Err(_p5._2._0); | |
} | |
} else { | |
return Err(_p5._1._0); | |
} | |
} else { | |
return Err(_p5._0._0); | |
} | |
}); | |
var 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 Ok(A4(func,_p6._0._0,_p6._1._0,_p6._2._0,_p6._3._0)); | |
} else { | |
return Err(_p6._3._0); | |
} | |
} else { | |
return Err(_p6._2._0); | |
} | |
} else { | |
return Err(_p6._1._0); | |
} | |
} else { | |
return Err(_p6._0._0); | |
} | |
}); | |
var 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 Ok(A5(func, | |
_p7._0._0, | |
_p7._1._0, | |
_p7._2._0, | |
_p7._3._0, | |
_p7._4._0)); | |
} else { | |
return Err(_p7._4._0); | |
} | |
} else { | |
return Err(_p7._3._0); | |
} | |
} else { | |
return Err(_p7._2._0); | |
} | |
} else { | |
return Err(_p7._1._0); | |
} | |
} else { | |
return Err(_p7._0._0); | |
} | |
}); | |
var formatError = F2(function (f,result) { | |
var _p8 = result; | |
if (_p8.ctor === "Ok") { | |
return Ok(_p8._0); | |
} else { | |
return Err(f(_p8._0)); | |
} | |
}); | |
var fromMaybe = F2(function (err,maybe) { | |
var _p9 = maybe; | |
if (_p9.ctor === "Just") { | |
return Ok(_p9._0); | |
} else { | |
return Err(err); | |
} | |
}); | |
return _elm.Result.values = {_op: _op | |
,withDefault: withDefault | |
,map: map | |
,map2: map2 | |
,map3: map3 | |
,map4: map4 | |
,map5: map5 | |
,andThen: andThen | |
,toMaybe: toMaybe | |
,fromMaybe: fromMaybe | |
,formatError: formatError | |
,Ok: Ok | |
,Err: Err}; | |
}; | |
Elm.Task = Elm.Task || {}; | |
Elm.Task.make = function (_elm) { | |
"use strict"; | |
_elm.Task = _elm.Task || {}; | |
if (_elm.Task.values) return _elm.Task.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Native$Task = Elm.Native.Task.make(_elm), | |
$Result = Elm.Result.make(_elm); | |
var _op = {}; | |
var sleep = $Native$Task.sleep; | |
var spawn = $Native$Task.spawn; | |
var ThreadID = function (a) { | |
return {ctor: "ThreadID",_0: a}; | |
}; | |
var onError = $Native$Task.catch_; | |
var andThen = $Native$Task.andThen; | |
var fail = $Native$Task.fail; | |
var mapError = F2(function (f,task) { | |
return A2(onError, | |
task, | |
function (err) { | |
return fail(f(err)); | |
}); | |
}); | |
var succeed = $Native$Task.succeed; | |
var map = F2(function (func,taskA) { | |
return A2(andThen, | |
taskA, | |
function (a) { | |
return succeed(func(a)); | |
}); | |
}); | |
var map2 = F3(function (func,taskA,taskB) { | |
return A2(andThen, | |
taskA, | |
function (a) { | |
return A2(andThen, | |
taskB, | |
function (b) { | |
return succeed(A2(func,a,b)); | |
}); | |
}); | |
}); | |
var map3 = F4(function (func,taskA,taskB,taskC) { | |
return A2(andThen, | |
taskA, | |
function (a) { | |
return A2(andThen, | |
taskB, | |
function (b) { | |
return A2(andThen, | |
taskC, | |
function (c) { | |
return succeed(A3(func,a,b,c)); | |
}); | |
}); | |
}); | |
}); | |
var map4 = F5(function (func,taskA,taskB,taskC,taskD) { | |
return A2(andThen, | |
taskA, | |
function (a) { | |
return A2(andThen, | |
taskB, | |
function (b) { | |
return A2(andThen, | |
taskC, | |
function (c) { | |
return A2(andThen, | |
taskD, | |
function (d) { | |
return succeed(A4(func,a,b,c,d)); | |
}); | |
}); | |
}); | |
}); | |
}); | |
var map5 = F6(function (func,taskA,taskB,taskC,taskD,taskE) { | |
return A2(andThen, | |
taskA, | |
function (a) { | |
return A2(andThen, | |
taskB, | |
function (b) { | |
return A2(andThen, | |
taskC, | |
function (c) { | |
return A2(andThen, | |
taskD, | |
function (d) { | |
return A2(andThen, | |
taskE, | |
function (e) { | |
return succeed(A5(func,a,b,c,d,e)); | |
}); | |
}); | |
}); | |
}); | |
}); | |
}); | |
var andMap = F2(function (taskFunc,taskValue) { | |
return A2(andThen, | |
taskFunc, | |
function (func) { | |
return A2(andThen, | |
taskValue, | |
function (value) { | |
return succeed(func(value)); | |
}); | |
}); | |
}); | |
var sequence = function (tasks) { | |
var _p0 = tasks; | |
if (_p0.ctor === "[]") { | |
return succeed(_U.list([])); | |
} else { | |
return A3(map2, | |
F2(function (x,y) { return A2($List._op["::"],x,y);}), | |
_p0._0, | |
sequence(_p0._1)); | |
} | |
}; | |
var toMaybe = function (task) { | |
return A2(onError, | |
A2(map,$Maybe.Just,task), | |
function (_p1) { | |
return succeed($Maybe.Nothing); | |
}); | |
}; | |
var fromMaybe = F2(function ($default,maybe) { | |
var _p2 = maybe; | |
if (_p2.ctor === "Just") { | |
return succeed(_p2._0); | |
} else { | |
return fail($default); | |
} | |
}); | |
var toResult = function (task) { | |
return A2(onError, | |
A2(map,$Result.Ok,task), | |
function (msg) { | |
return succeed($Result.Err(msg)); | |
}); | |
}; | |
var fromResult = function (result) { | |
var _p3 = result; | |
if (_p3.ctor === "Ok") { | |
return succeed(_p3._0); | |
} else { | |
return fail(_p3._0); | |
} | |
}; | |
var Task = {ctor: "Task"}; | |
return _elm.Task.values = {_op: _op | |
,succeed: succeed | |
,fail: fail | |
,map: map | |
,map2: map2 | |
,map3: map3 | |
,map4: map4 | |
,map5: map5 | |
,andMap: andMap | |
,sequence: sequence | |
,andThen: andThen | |
,onError: onError | |
,mapError: mapError | |
,toMaybe: toMaybe | |
,fromMaybe: fromMaybe | |
,toResult: toResult | |
,fromResult: fromResult | |
,spawn: spawn | |
,sleep: sleep}; | |
}; | |
Elm.Signal = Elm.Signal || {}; | |
Elm.Signal.make = function (_elm) { | |
"use strict"; | |
_elm.Signal = _elm.Signal || {}; | |
if (_elm.Signal.values) return _elm.Signal.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Native$Signal = Elm.Native.Signal.make(_elm), | |
$Task = Elm.Task.make(_elm); | |
var _op = {}; | |
var send = F2(function (_p0,value) { | |
var _p1 = _p0; | |
return A2($Task.onError, | |
_p1._0(value), | |
function (_p2) { | |
return $Task.succeed({ctor: "_Tuple0"}); | |
}); | |
}); | |
var Message = function (a) { | |
return {ctor: "Message",_0: a}; | |
}; | |
var message = F2(function (_p3,value) { | |
var _p4 = _p3; | |
return Message(_p4._0(value)); | |
}); | |
var mailbox = $Native$Signal.mailbox; | |
var Address = function (a) { | |
return {ctor: "Address",_0: a}; | |
}; | |
var forwardTo = F2(function (_p5,f) { | |
var _p6 = _p5; | |
return Address(function (x) { return _p6._0(f(x));}); | |
}); | |
var Mailbox = F2(function (a,b) { | |
return {address: a,signal: b}; | |
}); | |
var sampleOn = $Native$Signal.sampleOn; | |
var dropRepeats = $Native$Signal.dropRepeats; | |
var filterMap = $Native$Signal.filterMap; | |
var filter = F3(function (isOk,base,signal) { | |
return A3(filterMap, | |
function (value) { | |
return isOk(value) ? $Maybe.Just(value) : $Maybe.Nothing; | |
}, | |
base, | |
signal); | |
}); | |
var merge = F2(function (left,right) { | |
return A3($Native$Signal.genericMerge, | |
$Basics.always, | |
left, | |
right); | |
}); | |
var mergeMany = function (signalList) { | |
var _p7 = $List.reverse(signalList); | |
if (_p7.ctor === "[]") { | |
return _U.crashCase("Signal", | |
{start: {line: 184,column: 3},end: {line: 189,column: 40}}, | |
_p7)("mergeMany was given an empty list!"); | |
} else { | |
return A3($List.foldl,merge,_p7._0,_p7._1); | |
} | |
}; | |
var foldp = $Native$Signal.foldp; | |
var map5 = $Native$Signal.map5; | |
var map4 = $Native$Signal.map4; | |
var map3 = $Native$Signal.map3; | |
var map2 = $Native$Signal.map2; | |
var map = $Native$Signal.map; | |
var constant = $Native$Signal.constant; | |
var Signal = {ctor: "Signal"}; | |
return _elm.Signal.values = {_op: _op | |
,merge: merge | |
,mergeMany: mergeMany | |
,map: map | |
,map2: map2 | |
,map3: map3 | |
,map4: map4 | |
,map5: map5 | |
,constant: constant | |
,dropRepeats: dropRepeats | |
,filter: filter | |
,filterMap: filterMap | |
,sampleOn: sampleOn | |
,foldp: foldp | |
,mailbox: mailbox | |
,send: send | |
,message: message | |
,forwardTo: forwardTo | |
,Mailbox: Mailbox}; | |
}; | |
Elm.Time = Elm.Time || {}; | |
Elm.Time.make = function (_elm) { | |
"use strict"; | |
_elm.Time = _elm.Time || {}; | |
if (_elm.Time.values) return _elm.Time.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Native$Signal = Elm.Native.Signal.make(_elm), | |
$Native$Time = Elm.Native.Time.make(_elm), | |
$Signal = Elm.Signal.make(_elm); | |
var _op = {}; | |
var delay = $Native$Signal.delay; | |
var since = F2(function (time,signal) { | |
var stop = A2($Signal.map, | |
$Basics.always(-1), | |
A2(delay,time,signal)); | |
var start = A2($Signal.map,$Basics.always(1),signal); | |
var delaydiff = A3($Signal.foldp, | |
F2(function (x,y) { return x + y;}), | |
0, | |
A2($Signal.merge,start,stop)); | |
return A2($Signal.map, | |
F2(function (x,y) { return !_U.eq(x,y);})(0), | |
delaydiff); | |
}); | |
var timestamp = $Native$Signal.timestamp; | |
var every = $Native$Time.every; | |
var fpsWhen = $Native$Time.fpsWhen; | |
var fps = function (targetFrames) { | |
return A2(fpsWhen,targetFrames,$Signal.constant(true)); | |
}; | |
var inMilliseconds = function (t) { return t;}; | |
var millisecond = 1; | |
var second = 1000 * millisecond; | |
var minute = 60 * second; | |
var hour = 60 * minute; | |
var inHours = function (t) { return t / hour;}; | |
var inMinutes = function (t) { return t / minute;}; | |
var inSeconds = function (t) { return t / second;}; | |
return _elm.Time.values = {_op: _op | |
,millisecond: millisecond | |
,second: second | |
,minute: minute | |
,hour: hour | |
,inMilliseconds: inMilliseconds | |
,inSeconds: inSeconds | |
,inMinutes: inMinutes | |
,inHours: inHours | |
,fps: fps | |
,fpsWhen: fpsWhen | |
,every: every | |
,timestamp: timestamp | |
,delay: delay | |
,since: since}; | |
}; | |
Elm.Native.String = {}; | |
Elm.Native.String.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.String = localRuntime.Native.String || {}; | |
if (localRuntime.Native.String.values) | |
{ | |
return localRuntime.Native.String.values; | |
} | |
if ('values' in Elm.Native.String) | |
{ | |
return localRuntime.Native.String.values = Elm.Native.String.values; | |
} | |
var Char = Elm.Char.make(localRuntime); | |
var List = Elm.Native.List.make(localRuntime); | |
var Maybe = Elm.Maybe.make(localRuntime); | |
var Result = Elm.Result.make(localRuntime); | |
var Utils = Elm.Native.Utils.make(localRuntime); | |
function isEmpty(str) | |
{ | |
return str.length === 0; | |
} | |
function cons(chr, str) | |
{ | |
return chr + str; | |
} | |
function uncons(str) | |
{ | |
var hd = str[0]; | |
if (hd) | |
{ | |
return Maybe.Just(Utils.Tuple2(Utils.chr(hd), str.slice(1))); | |
} | |
return Maybe.Nothing; | |
} | |
function append(a, b) | |
{ | |
return a + b; | |
} | |
function concat(strs) | |
{ | |
return 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(Utils.chr(out[i])); | |
} | |
return out.join(''); | |
} | |
function filter(pred, str) | |
{ | |
return str.split('').map(Utils.chr).filter(pred).join(''); | |
} | |
function reverse(str) | |
{ | |
return str.split('').reverse().join(''); | |
} | |
function foldl(f, b, str) | |
{ | |
var len = str.length; | |
for (var i = 0; i < len; ++i) | |
{ | |
b = A2(f, Utils.chr(str[i]), b); | |
} | |
return b; | |
} | |
function foldr(f, b, str) | |
{ | |
for (var i = str.length; i--; ) | |
{ | |
b = A2(f, Utils.chr(str[i]), b); | |
} | |
return b; | |
} | |
function split(sep, str) | |
{ | |
return List.fromArray(str.split(sep)); | |
} | |
function join(sep, strs) | |
{ | |
return 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 List.fromArray(str.trim().split(/\s+/g)); | |
} | |
function lines(str) | |
{ | |
return 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(Utils.chr(str[i]))) | |
{ | |
return true; | |
} | |
} | |
return false; | |
} | |
function all(pred, str) | |
{ | |
for (var i = str.length; i--; ) | |
{ | |
if (!pred(Utils.chr(str[i]))) | |
{ | |
return false; | |
} | |
} | |
return true; | |
} | |
function contains(sub, str) | |
{ | |
return str.indexOf(sub) > -1; | |
} | |
function startsWith(sub, str) | |
{ | |
return str.indexOf(sub) === 0; | |
} | |
function endsWith(sub, str) | |
{ | |
return str.length >= sub.length && | |
str.lastIndexOf(sub) === str.length - sub.length; | |
} | |
function indexes(sub, str) | |
{ | |
var subLen = sub.length; | |
var i = 0; | |
var is = []; | |
while ((i = str.indexOf(sub, i)) > -1) | |
{ | |
is.push(i); | |
i = i + subLen; | |
} | |
return List.fromArray(is); | |
} | |
function toInt(s) | |
{ | |
var len = s.length; | |
if (len === 0) | |
{ | |
return Result.Err("could not convert string '" + s + "' to an Int" ); | |
} | |
var start = 0; | |
if (s[0] === '-') | |
{ | |
if (len === 1) | |
{ | |
return Result.Err("could not convert string '" + s + "' to an Int" ); | |
} | |
start = 1; | |
} | |
for (var i = start; i < len; ++i) | |
{ | |
if (!Char.isDigit(s[i])) | |
{ | |
return Result.Err("could not convert string '" + s + "' to an Int" ); | |
} | |
} | |
return Result.Ok(parseInt(s, 10)); | |
} | |
function toFloat(s) | |
{ | |
var len = s.length; | |
if (len === 0) | |
{ | |
return Result.Err("could not convert string '" + s + "' to a Float" ); | |
} | |
var start = 0; | |
if (s[0] === '-') | |
{ | |
if (len === 1) | |
{ | |
return Result.Err("could not convert string '" + s + "' to a Float" ); | |
} | |
start = 1; | |
} | |
var dotCount = 0; | |
for (var i = start; i < len; ++i) | |
{ | |
if (Char.isDigit(s[i])) | |
{ | |
continue; | |
} | |
if (s[i] === '.') | |
{ | |
dotCount += 1; | |
if (dotCount <= 1) | |
{ | |
continue; | |
} | |
} | |
return Result.Err("could not convert string '" + s + "' to a Float" ); | |
} | |
return Result.Ok(parseFloat(s)); | |
} | |
function toList(str) | |
{ | |
return List.fromArray(str.split('').map(Utils.chr)); | |
} | |
function fromList(chars) | |
{ | |
return List.toArray(chars).join(''); | |
} | |
return Elm.Native.String.values = { | |
isEmpty: isEmpty, | |
cons: F2(cons), | |
uncons: uncons, | |
append: F2(append), | |
concat: concat, | |
length: length, | |
map: F2(map), | |
filter: F2(filter), | |
reverse: reverse, | |
foldl: F3(foldl), | |
foldr: F3(foldr), | |
split: F2(split), | |
join: F2(join), | |
repeat: F2(repeat), | |
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 | |
}; | |
}; | |
Elm.String = Elm.String || {}; | |
Elm.String.make = function (_elm) { | |
"use strict"; | |
_elm.String = _elm.String || {}; | |
if (_elm.String.values) return _elm.String.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Native$String = Elm.Native.String.make(_elm), | |
$Result = Elm.Result.make(_elm); | |
var _op = {}; | |
var fromList = $Native$String.fromList; | |
var toList = $Native$String.toList; | |
var toFloat = $Native$String.toFloat; | |
var toInt = $Native$String.toInt; | |
var indices = $Native$String.indexes; | |
var indexes = $Native$String.indexes; | |
var endsWith = $Native$String.endsWith; | |
var startsWith = $Native$String.startsWith; | |
var contains = $Native$String.contains; | |
var all = $Native$String.all; | |
var any = $Native$String.any; | |
var toLower = $Native$String.toLower; | |
var toUpper = $Native$String.toUpper; | |
var lines = $Native$String.lines; | |
var words = $Native$String.words; | |
var trimRight = $Native$String.trimRight; | |
var trimLeft = $Native$String.trimLeft; | |
var trim = $Native$String.trim; | |
var padRight = $Native$String.padRight; | |
var padLeft = $Native$String.padLeft; | |
var pad = $Native$String.pad; | |
var dropRight = $Native$String.dropRight; | |
var dropLeft = $Native$String.dropLeft; | |
var right = $Native$String.right; | |
var left = $Native$String.left; | |
var slice = $Native$String.slice; | |
var repeat = $Native$String.repeat; | |
var join = $Native$String.join; | |
var split = $Native$String.split; | |
var foldr = $Native$String.foldr; | |
var foldl = $Native$String.foldl; | |
var reverse = $Native$String.reverse; | |
var filter = $Native$String.filter; | |
var map = $Native$String.map; | |
var length = $Native$String.length; | |
var concat = $Native$String.concat; | |
var append = $Native$String.append; | |
var uncons = $Native$String.uncons; | |
var cons = $Native$String.cons; | |
var fromChar = function ($char) { return A2(cons,$char,"");}; | |
var isEmpty = $Native$String.isEmpty; | |
return _elm.String.values = {_op: _op | |
,isEmpty: isEmpty | |
,length: length | |
,reverse: reverse | |
,repeat: repeat | |
,cons: cons | |
,uncons: uncons | |
,fromChar: fromChar | |
,append: append | |
,concat: concat | |
,split: split | |
,join: join | |
,words: words | |
,lines: lines | |
,slice: slice | |
,left: left | |
,right: right | |
,dropLeft: dropLeft | |
,dropRight: dropRight | |
,contains: contains | |
,startsWith: startsWith | |
,endsWith: endsWith | |
,indexes: indexes | |
,indices: indices | |
,toInt: toInt | |
,toFloat: toFloat | |
,toList: toList | |
,fromList: fromList | |
,toUpper: toUpper | |
,toLower: toLower | |
,pad: pad | |
,padLeft: padLeft | |
,padRight: padRight | |
,trim: trim | |
,trimLeft: trimLeft | |
,trimRight: trimRight | |
,map: map | |
,filter: filter | |
,foldl: foldl | |
,foldr: foldr | |
,any: any | |
,all: all}; | |
}; | |
Elm.Dict = Elm.Dict || {}; | |
Elm.Dict.make = function (_elm) { | |
"use strict"; | |
_elm.Dict = _elm.Dict || {}; | |
if (_elm.Dict.values) return _elm.Dict.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Native$Debug = Elm.Native.Debug.make(_elm), | |
$String = Elm.String.make(_elm); | |
var _op = {}; | |
var 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(foldr,f,acc,_p0._4)), | |
_v3 = _p0._3; | |
f = _v1; | |
acc = _v2; | |
t = _v3; | |
continue foldr; | |
} | |
} | |
}); | |
var keys = function (dict) { | |
return A3(foldr, | |
F3(function (key,value,keyList) { | |
return A2($List._op["::"],key,keyList); | |
}), | |
_U.list([]), | |
dict); | |
}; | |
var values = function (dict) { | |
return A3(foldr, | |
F3(function (key,value,valueList) { | |
return A2($List._op["::"],value,valueList); | |
}), | |
_U.list([]), | |
dict); | |
}; | |
var toList = function (dict) { | |
return A3(foldr, | |
F3(function (key,value,list) { | |
return A2($List._op["::"], | |
{ctor: "_Tuple2",_0: key,_1: value}, | |
list); | |
}), | |
_U.list([]), | |
dict); | |
}; | |
var 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(foldl,f,acc,_p1._3)), | |
_v7 = _p1._4; | |
f = _v5; | |
acc = _v6; | |
dict = _v7; | |
continue foldl; | |
} | |
} | |
}); | |
var reportRemBug = F4(function (msg,c,lgot,rgot) { | |
return $Native$Debug.crash($String.concat(_U.list(["Internal red-black tree invariant violated, expected " | |
,msg | |
," and got " | |
,$Basics.toString(c) | |
,"/" | |
,lgot | |
,"/" | |
,rgot | |
,"\nPlease report this bug to <https://github.com/elm-lang/core/issues>"]))); | |
}); | |
var isBBlack = function (dict) { | |
var _p2 = dict; | |
_v8_2: do { | |
if (_p2.ctor === "RBNode_elm_builtin") { | |
if (_p2._0.ctor === "BBlack") { | |
return true; | |
} else { | |
break _v8_2; | |
} | |
} else { | |
if (_p2._0.ctor === "LBBlack") { | |
return true; | |
} else { | |
break _v8_2; | |
} | |
} | |
} while (false); | |
return false; | |
}; | |
var Same = {ctor: "Same"}; | |
var Remove = {ctor: "Remove"}; | |
var Insert = {ctor: "Insert"}; | |
var sizeHelp = F2(function (n,dict) { | |
sizeHelp: while (true) { | |
var _p3 = dict; | |
if (_p3.ctor === "RBEmpty_elm_builtin") { | |
return n; | |
} else { | |
var _v10 = A2(sizeHelp,n + 1,_p3._4),_v11 = _p3._3; | |
n = _v10; | |
dict = _v11; | |
continue sizeHelp; | |
} | |
} | |
}); | |
var size = function (dict) { return A2(sizeHelp,0,dict);}; | |
var get = F2(function (targetKey,dict) { | |
get: while (true) { | |
var _p4 = dict; | |
if (_p4.ctor === "RBEmpty_elm_builtin") { | |
return $Maybe.Nothing; | |
} else { | |
var _p5 = A2($Basics.compare,targetKey,_p4._1); | |
switch (_p5.ctor) | |
{case "LT": var _v14 = targetKey,_v15 = _p4._3; | |
targetKey = _v14; | |
dict = _v15; | |
continue get; | |
case "EQ": return $Maybe.Just(_p4._2); | |
default: var _v16 = targetKey,_v17 = _p4._4; | |
targetKey = _v16; | |
dict = _v17; | |
continue get;} | |
} | |
} | |
}); | |
var member = F2(function (key,dict) { | |
var _p6 = A2(get,key,dict); | |
if (_p6.ctor === "Just") { | |
return true; | |
} else { | |
return false; | |
} | |
}); | |
var maxWithDefault = F3(function (k,v,r) { | |
maxWithDefault: while (true) { | |
var _p7 = r; | |
if (_p7.ctor === "RBEmpty_elm_builtin") { | |
return {ctor: "_Tuple2",_0: k,_1: v}; | |
} else { | |
var _v20 = _p7._1,_v21 = _p7._2,_v22 = _p7._4; | |
k = _v20; | |
v = _v21; | |
r = _v22; | |
continue maxWithDefault; | |
} | |
} | |
}); | |
var RBEmpty_elm_builtin = function (a) { | |
return {ctor: "RBEmpty_elm_builtin",_0: a}; | |
}; | |
var 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 LBBlack = {ctor: "LBBlack"}; | |
var LBlack = {ctor: "LBlack"}; | |
var empty = RBEmpty_elm_builtin(LBlack); | |
var isEmpty = function (dict) { return _U.eq(dict,empty);}; | |
var map = F2(function (f,dict) { | |
var _p8 = dict; | |
if (_p8.ctor === "RBEmpty_elm_builtin") { | |
return RBEmpty_elm_builtin(LBlack); | |
} else { | |
var _p9 = _p8._1; | |
return A5(RBNode_elm_builtin, | |
_p8._0, | |
_p9, | |
A2(f,_p9,_p8._2), | |
A2(map,f,_p8._3), | |
A2(map,f,_p8._4)); | |
} | |
}); | |
var NBlack = {ctor: "NBlack"}; | |
var BBlack = {ctor: "BBlack"}; | |
var Black = {ctor: "Black"}; | |
var ensureBlackRoot = function (dict) { | |
var _p10 = dict; | |
if (_p10.ctor === "RBNode_elm_builtin" && _p10._0.ctor === "Red") | |
{ | |
return A5(RBNode_elm_builtin, | |
Black, | |
_p10._1, | |
_p10._2, | |
_p10._3, | |
_p10._4); | |
} else { | |
return dict; | |
} | |
}; | |
var blackish = function (t) { | |
var _p11 = t; | |
if (_p11.ctor === "RBNode_elm_builtin") { | |
var _p12 = _p11._0; | |
return _U.eq(_p12,Black) || _U.eq(_p12,BBlack); | |
} else { | |
return true; | |
} | |
}; | |
var blacken = function (t) { | |
var _p13 = t; | |
if (_p13.ctor === "RBEmpty_elm_builtin") { | |
return RBEmpty_elm_builtin(LBlack); | |
} else { | |
return A5(RBNode_elm_builtin, | |
Black, | |
_p13._1, | |
_p13._2, | |
_p13._3, | |
_p13._4); | |
} | |
}; | |
var Red = {ctor: "Red"}; | |
var moreBlack = function (color) { | |
var _p14 = color; | |
switch (_p14.ctor) | |
{case "Black": return BBlack; | |
case "Red": return Black; | |
case "NBlack": return Red; | |
default: | |
return $Native$Debug.crash("Can\'t make a double black node more black!");} | |
}; | |
var lessBlack = function (color) { | |
var _p15 = color; | |
switch (_p15.ctor) | |
{case "BBlack": return Black; | |
case "Black": return Red; | |
case "Red": return NBlack; | |
default: | |
return $Native$Debug.crash("Can\'t make a negative black node less black!");} | |
}; | |
var lessBlackTree = function (dict) { | |
var _p16 = dict; | |
if (_p16.ctor === "RBNode_elm_builtin") { | |
return A5(RBNode_elm_builtin, | |
lessBlack(_p16._0), | |
_p16._1, | |
_p16._2, | |
_p16._3, | |
_p16._4); | |
} else { | |
return RBEmpty_elm_builtin(LBlack); | |
} | |
}; | |
var 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(RBNode_elm_builtin, | |
lessBlack(col), | |
yk, | |
yv, | |
A5(RBNode_elm_builtin,Black,xk,xv,a,b), | |
A5(RBNode_elm_builtin,Black,zk,zv,c,d)); | |
}; | |
}; | |
}; | |
}; | |
}; | |
}; | |
}; | |
}; | |
}; | |
}; | |
}; | |
var redden = function (t) { | |
var _p17 = t; | |
if (_p17.ctor === "RBEmpty_elm_builtin") { | |
return $Native$Debug.crash("can\'t make a Leaf red"); | |
} else { | |
return A5(RBNode_elm_builtin, | |
Red, | |
_p17._1, | |
_p17._2, | |
_p17._3, | |
_p17._4); | |
} | |
}; | |
var balanceHelp = function (tree) { | |
var _p18 = tree; | |
_v31_6: do { | |
_v31_5: do { | |
_v31_4: do { | |
_v31_3: do { | |
_v31_2: do { | |
_v31_1: do { | |
_v31_0: do { | |
if (_p18.ctor === "RBNode_elm_builtin") { | |
if (_p18._3.ctor === "RBNode_elm_builtin") { | |
if (_p18._4.ctor === "RBNode_elm_builtin") { | |
switch (_p18._3._0.ctor) | |
{case "Red": switch (_p18._4._0.ctor) | |
{case "Red": | |
if (_p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Red") | |
{ | |
break _v31_0; | |
} else { | |
if (_p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Red") | |
{ | |
break _v31_1; | |
} else { | |
if (_p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Red") | |
{ | |
break _v31_2; | |
} else { | |
if (_p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Red") | |
{ | |
break _v31_3; | |
} else { | |
break _v31_6; | |
} | |
} | |
} | |
} | |
case "NBlack": | |
if (_p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Red") | |
{ | |
break _v31_0; | |
} else { | |
if (_p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Red") | |
{ | |
break _v31_1; | |
} else { | |
if (_p18._0.ctor === "BBlack" && _p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Black" && _p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Black") | |
{ | |
break _v31_4; | |
} else { | |
break _v31_6; | |
} | |
} | |
} | |
default: | |
if (_p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Red") | |
{ | |
break _v31_0; | |
} else { | |
if (_p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Red") | |
{ | |
break _v31_1; | |
} else { | |
break _v31_6; | |
} | |
}} | |
case "NBlack": switch (_p18._4._0.ctor) | |
{case "Red": | |
if (_p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Red") | |
{ | |
break _v31_2; | |
} else { | |
if (_p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Red") | |
{ | |
break _v31_3; | |
} else { | |
if (_p18._0.ctor === "BBlack" && _p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Black" && _p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Black") | |
{ | |
break _v31_5; | |
} else { | |
break _v31_6; | |
} | |
} | |
} | |
case "NBlack": if (_p18._0.ctor === "BBlack") { | |
if (_p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Black" && _p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Black") | |
{ | |
break _v31_4; | |
} else { | |
if (_p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Black" && _p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Black") | |
{ | |
break _v31_5; | |
} else { | |
break _v31_6; | |
} | |
} | |
} else { | |
break _v31_6; | |
} | |
default: | |
if (_p18._0.ctor === "BBlack" && _p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Black" && _p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Black") | |
{ | |
break _v31_5; | |
} else { | |
break _v31_6; | |
}} | |
default: switch (_p18._4._0.ctor) | |
{case "Red": | |
if (_p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Red") | |
{ | |
break _v31_2; | |
} else { | |
if (_p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Red") | |
{ | |
break _v31_3; | |
} else { | |
break _v31_6; | |
} | |
} | |
case "NBlack": | |
if (_p18._0.ctor === "BBlack" && _p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Black" && _p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Black") | |
{ | |
break _v31_4; | |
} else { | |
break _v31_6; | |
} | |
default: break _v31_6;}} | |
} else { | |
switch (_p18._3._0.ctor) | |
{case "Red": | |
if (_p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Red") | |
{ | |
break _v31_0; | |
} else { | |
if (_p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Red") | |
{ | |
break _v31_1; | |
} else { | |
break _v31_6; | |
} | |
} | |
case "NBlack": | |
if (_p18._0.ctor === "BBlack" && _p18._3._3.ctor === "RBNode_elm_builtin" && _p18._3._3._0.ctor === "Black" && _p18._3._4.ctor === "RBNode_elm_builtin" && _p18._3._4._0.ctor === "Black") | |
{ | |
break _v31_5; | |
} else { | |
break _v31_6; | |
} | |
default: break _v31_6;} | |
} | |
} else { | |
if (_p18._4.ctor === "RBNode_elm_builtin") { | |
switch (_p18._4._0.ctor) | |
{case "Red": | |
if (_p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Red") | |
{ | |
break _v31_2; | |
} else { | |
if (_p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Red") | |
{ | |
break _v31_3; | |
} else { | |
break _v31_6; | |
} | |
} | |
case "NBlack": | |
if (_p18._0.ctor === "BBlack" && _p18._4._3.ctor === "RBNode_elm_builtin" && _p18._4._3._0.ctor === "Black" && _p18._4._4.ctor === "RBNode_elm_builtin" && _p18._4._4._0.ctor === "Black") | |
{ | |
break _v31_4; | |
} else { | |
break _v31_6; | |
} | |
default: break _v31_6;} | |
} else { | |
break _v31_6; | |
} | |
} | |
} else { | |
break _v31_6; | |
} | |
} while (false); | |
return balancedTree(_p18._0)(_p18._3._3._1)(_p18._3._3._2)(_p18._3._1)(_p18._3._2)(_p18._1)(_p18._2)(_p18._3._3._3)(_p18._3._3._4)(_p18._3._4)(_p18._4); | |
} while (false); | |
return balancedTree(_p18._0)(_p18._3._1)(_p18._3._2)(_p18._3._4._1)(_p18._3._4._2)(_p18._1)(_p18._2)(_p18._3._3)(_p18._3._4._3)(_p18._3._4._4)(_p18._4); | |
} while (false); | |
return balancedTree(_p18._0)(_p18._1)(_p18._2)(_p18._4._3._1)(_p18._4._3._2)(_p18._4._1)(_p18._4._2)(_p18._3)(_p18._4._3._3)(_p18._4._3._4)(_p18._4._4); | |
} while (false); | |
return balancedTree(_p18._0)(_p18._1)(_p18._2)(_p18._4._1)(_p18._4._2)(_p18._4._4._1)(_p18._4._4._2)(_p18._3)(_p18._4._3)(_p18._4._4._3)(_p18._4._4._4); | |
} while (false); | |
return A5(RBNode_elm_builtin, | |
Black, | |
_p18._4._3._1, | |
_p18._4._3._2, | |
A5(RBNode_elm_builtin, | |
Black, | |
_p18._1, | |
_p18._2, | |
_p18._3, | |
_p18._4._3._3), | |
A5(balance, | |
Black, | |
_p18._4._1, | |
_p18._4._2, | |
_p18._4._3._4, | |
redden(_p18._4._4))); | |
} while (false); | |
return A5(RBNode_elm_builtin, | |
Black, | |
_p18._3._4._1, | |
_p18._3._4._2, | |
A5(balance, | |
Black, | |
_p18._3._1, | |
_p18._3._2, | |
redden(_p18._3._3), | |
_p18._3._4._3), | |
A5(RBNode_elm_builtin, | |
Black, | |
_p18._1, | |
_p18._2, | |
_p18._3._4._4, | |
_p18._4)); | |
} while (false); | |
return tree; | |
}; | |
var balance = F5(function (c,k,v,l,r) { | |
var tree = A5(RBNode_elm_builtin,c,k,v,l,r); | |
return blackish(tree) ? balanceHelp(tree) : tree; | |
}); | |
var bubble = F5(function (c,k,v,l,r) { | |
return isBBlack(l) || isBBlack(r) ? A5(balance, | |
moreBlack(c), | |
k, | |
v, | |
lessBlackTree(l), | |
lessBlackTree(r)) : A5(RBNode_elm_builtin,c,k,v,l,r); | |
}); | |
var removeMax = F5(function (c,k,v,l,r) { | |
var _p19 = r; | |
if (_p19.ctor === "RBEmpty_elm_builtin") { | |
return A3(rem,c,l,r); | |
} else { | |
return A5(bubble, | |
c, | |
k, | |
v, | |
l, | |
A5(removeMax,_p19._0,_p19._1,_p19._2,_p19._3,_p19._4)); | |
} | |
}); | |
var rem = F3(function (c,l,r) { | |
var _p20 = {ctor: "_Tuple2",_0: l,_1: r}; | |
if (_p20._0.ctor === "RBEmpty_elm_builtin") { | |
if (_p20._1.ctor === "RBEmpty_elm_builtin") { | |
var _p21 = c; | |
switch (_p21.ctor) | |
{case "Red": return RBEmpty_elm_builtin(LBlack); | |
case "Black": return RBEmpty_elm_builtin(LBBlack); | |
default: | |
return $Native$Debug.crash("cannot have bblack or nblack nodes at this point");} | |
} else { | |
var _p24 = _p20._1._0; | |
var _p23 = _p20._0._0; | |
var _p22 = {ctor: "_Tuple3",_0: c,_1: _p23,_2: _p24}; | |
if (_p22.ctor === "_Tuple3" && _p22._0.ctor === "Black" && _p22._1.ctor === "LBlack" && _p22._2.ctor === "Red") | |
{ | |
return A5(RBNode_elm_builtin, | |
Black, | |
_p20._1._1, | |
_p20._1._2, | |
_p20._1._3, | |
_p20._1._4); | |
} else { | |
return A4(reportRemBug, | |
"Black/LBlack/Red", | |
c, | |
$Basics.toString(_p23), | |
$Basics.toString(_p24)); | |
} | |
} | |
} else { | |
if (_p20._1.ctor === "RBEmpty_elm_builtin") { | |
var _p27 = _p20._1._0; | |
var _p26 = _p20._0._0; | |
var _p25 = {ctor: "_Tuple3",_0: c,_1: _p26,_2: _p27}; | |
if (_p25.ctor === "_Tuple3" && _p25._0.ctor === "Black" && _p25._1.ctor === "Red" && _p25._2.ctor === "LBlack") | |
{ | |
return A5(RBNode_elm_builtin, | |
Black, | |
_p20._0._1, | |
_p20._0._2, | |
_p20._0._3, | |
_p20._0._4); | |
} else { | |
return A4(reportRemBug, | |
"Black/Red/LBlack", | |
c, | |
$Basics.toString(_p26), | |
$Basics.toString(_p27)); | |
} | |
} else { | |
var _p31 = _p20._0._2; | |
var _p30 = _p20._0._4; | |
var _p29 = _p20._0._1; | |
var l$ = A5(removeMax,_p20._0._0,_p29,_p31,_p20._0._3,_p30); | |
var _p28 = A3(maxWithDefault,_p29,_p31,_p30); | |
var k = _p28._0; | |
var v = _p28._1; | |
return A5(bubble,c,k,v,l$,r); | |
} | |
} | |
}); | |
var update = F3(function (k,alter,dict) { | |
var up = function (dict) { | |
var _p32 = dict; | |
if (_p32.ctor === "RBEmpty_elm_builtin") { | |
var _p33 = alter($Maybe.Nothing); | |
if (_p33.ctor === "Nothing") { | |
return {ctor: "_Tuple2",_0: Same,_1: empty}; | |
} else { | |
return {ctor: "_Tuple2" | |
,_0: Insert | |
,_1: A5(RBNode_elm_builtin,Red,k,_p33._0,empty,empty)}; | |
} | |
} else { | |
var _p44 = _p32._2; | |
var _p43 = _p32._4; | |
var _p42 = _p32._3; | |
var _p41 = _p32._1; | |
var _p40 = _p32._0; | |
var _p34 = A2($Basics.compare,k,_p41); | |
switch (_p34.ctor) | |
{case "EQ": var _p35 = alter($Maybe.Just(_p44)); | |
if (_p35.ctor === "Nothing") { | |
return {ctor: "_Tuple2" | |
,_0: Remove | |
,_1: A3(rem,_p40,_p42,_p43)}; | |
} else { | |
return {ctor: "_Tuple2" | |
,_0: Same | |
,_1: A5(RBNode_elm_builtin,_p40,_p41,_p35._0,_p42,_p43)}; | |
} | |
case "LT": var _p36 = up(_p42); | |
var flag = _p36._0; | |
var newLeft = _p36._1; | |
var _p37 = flag; | |
switch (_p37.ctor) | |
{case "Same": return {ctor: "_Tuple2" | |
,_0: Same | |
,_1: A5(RBNode_elm_builtin,_p40,_p41,_p44,newLeft,_p43)}; | |
case "Insert": return {ctor: "_Tuple2" | |
,_0: Insert | |
,_1: A5(balance,_p40,_p41,_p44,newLeft,_p43)}; | |
default: return {ctor: "_Tuple2" | |
,_0: Remove | |
,_1: A5(bubble,_p40,_p41,_p44,newLeft,_p43)};} | |
default: var _p38 = up(_p43); | |
var flag = _p38._0; | |
var newRight = _p38._1; | |
var _p39 = flag; | |
switch (_p39.ctor) | |
{case "Same": return {ctor: "_Tuple2" | |
,_0: Same | |
,_1: A5(RBNode_elm_builtin,_p40,_p41,_p44,_p42,newRight)}; | |
case "Insert": return {ctor: "_Tuple2" | |
,_0: Insert | |
,_1: A5(balance,_p40,_p41,_p44,_p42,newRight)}; | |
default: return {ctor: "_Tuple2" | |
,_0: Remove | |
,_1: A5(bubble,_p40,_p41,_p44,_p42,newRight)};}} | |
} | |
}; | |
var _p45 = up(dict); | |
var flag = _p45._0; | |
var updatedDict = _p45._1; | |
var _p46 = flag; | |
switch (_p46.ctor) | |
{case "Same": return updatedDict; | |
case "Insert": return ensureBlackRoot(updatedDict); | |
default: return blacken(updatedDict);} | |
}); | |
var insert = F3(function (key,value,dict) { | |
return A3(update, | |
key, | |
$Basics.always($Maybe.Just(value)), | |
dict); | |
}); | |
var singleton = F2(function (key,value) { | |
return A3(insert,key,value,empty); | |
}); | |
var union = F2(function (t1,t2) { | |
return A3(foldl,insert,t2,t1); | |
}); | |
var fromList = function (assocs) { | |
return A3($List.foldl, | |
F2(function (_p47,dict) { | |
var _p48 = _p47; | |
return A3(insert,_p48._0,_p48._1,dict); | |
}), | |
empty, | |
assocs); | |
}; | |
var filter = F2(function (predicate,dictionary) { | |
var add = F3(function (key,value,dict) { | |
return A2(predicate,key,value) ? A3(insert, | |
key, | |
value, | |
dict) : dict; | |
}); | |
return A3(foldl,add,empty,dictionary); | |
}); | |
var intersect = F2(function (t1,t2) { | |
return A2(filter, | |
F2(function (k,_p49) { return A2(member,k,t2);}), | |
t1); | |
}); | |
var partition = F2(function (predicate,dict) { | |
var add = F3(function (key,value,_p50) { | |
var _p51 = _p50; | |
var _p53 = _p51._1; | |
var _p52 = _p51._0; | |
return A2(predicate,key,value) ? {ctor: "_Tuple2" | |
,_0: A3(insert,key,value,_p52) | |
,_1: _p53} : {ctor: "_Tuple2" | |
,_0: _p52 | |
,_1: A3(insert,key,value,_p53)}; | |
}); | |
return A3(foldl,add,{ctor: "_Tuple2",_0: empty,_1: empty},dict); | |
}); | |
var remove = F2(function (key,dict) { | |
return A3(update,key,$Basics.always($Maybe.Nothing),dict); | |
}); | |
var diff = F2(function (t1,t2) { | |
return A3(foldl, | |
F3(function (k,v,t) { return A2(remove,k,t);}), | |
t1, | |
t2); | |
}); | |
return _elm.Dict.values = {_op: _op | |
,empty: empty | |
,singleton: singleton | |
,insert: insert | |
,update: update | |
,isEmpty: isEmpty | |
,get: get | |
,remove: remove | |
,member: member | |
,size: size | |
,filter: filter | |
,partition: partition | |
,foldl: foldl | |
,foldr: foldr | |
,map: map | |
,union: union | |
,intersect: intersect | |
,diff: diff | |
,keys: keys | |
,values: values | |
,toList: toList | |
,fromList: fromList}; | |
}; | |
Elm.Native.Json = {}; | |
Elm.Native.Json.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Json = localRuntime.Native.Json || {}; | |
if (localRuntime.Native.Json.values) { | |
return localRuntime.Native.Json.values; | |
} | |
var ElmArray = Elm.Native.Array.make(localRuntime); | |
var List = Elm.Native.List.make(localRuntime); | |
var Maybe = Elm.Maybe.make(localRuntime); | |
var Result = Elm.Result.make(localRuntime); | |
var Utils = Elm.Native.Utils.make(localRuntime); | |
function crash(expected, actual) { | |
throw new Error( | |
'expecting ' + expected + ' but got ' + JSON.stringify(actual) | |
); | |
} | |
// PRIMITIVE VALUES | |
function decodeNull(successValue) { | |
return function(value) { | |
if (value === null) { | |
return successValue; | |
} | |
crash('null', value); | |
}; | |
} | |
function decodeString(value) { | |
if (typeof value === 'string' || value instanceof String) { | |
return value; | |
} | |
crash('a String', value); | |
} | |
function decodeFloat(value) { | |
if (typeof value === 'number') { | |
return value; | |
} | |
crash('a Float', value); | |
} | |
function decodeInt(value) { | |
if (typeof value !== 'number') { | |
crash('an Int', value); | |
} | |
if (value < 2147483647 && value > -2147483647 && (value | 0) === value) { | |
return value; | |
} | |
if (isFinite(value) && !(value % 1)) { | |
return value; | |
} | |
crash('an Int', value); | |
} | |
function decodeBool(value) { | |
if (typeof value === 'boolean') { | |
return value; | |
} | |
crash('a Bool', value); | |
} | |
// ARRAY | |
function decodeArray(decoder) { | |
return function(value) { | |
if (value instanceof Array) { | |
var len = value.length; | |
var array = new Array(len); | |
for (var i = len; i--; ) { | |
array[i] = decoder(value[i]); | |
} | |
return ElmArray.fromJSArray(array); | |
} | |
crash('an Array', value); | |
}; | |
} | |
// LIST | |
function decodeList(decoder) { | |
return function(value) { | |
if (value instanceof Array) { | |
var len = value.length; | |
var list = List.Nil; | |
for (var i = len; i--; ) { | |
list = List.Cons( decoder(value[i]), list ); | |
} | |
return list; | |
} | |
crash('a List', value); | |
}; | |
} | |
// MAYBE | |
function decodeMaybe(decoder) { | |
return function(value) { | |
try { | |
return Maybe.Just(decoder(value)); | |
} catch(e) { | |
return Maybe.Nothing; | |
} | |
}; | |
} | |
// FIELDS | |
function decodeField(field, decoder) { | |
return function(value) { | |
var subValue = value[field]; | |
if (subValue !== undefined) { | |
return decoder(subValue); | |
} | |
crash("an object with field '" + field + "'", value); | |
}; | |
} | |
// OBJECTS | |
function decodeKeyValuePairs(decoder) { | |
return function(value) { | |
var isObject = | |
typeof value === 'object' | |
&& value !== null | |
&& !(value instanceof Array); | |
if (isObject) { | |
var keyValuePairs = List.Nil; | |
for (var key in value) | |
{ | |
var elmValue = decoder(value[key]); | |
var pair = Utils.Tuple2(key, elmValue); | |
keyValuePairs = List.Cons(pair, keyValuePairs); | |
} | |
return keyValuePairs; | |
} | |
crash('an object', value); | |
}; | |
} | |
function decodeObject1(f, d1) { | |
return function(value) { | |
return f(d1(value)); | |
}; | |
} | |
function decodeObject2(f, d1, d2) { | |
return function(value) { | |
return A2( f, d1(value), d2(value) ); | |
}; | |
} | |
function decodeObject3(f, d1, d2, d3) { | |
return function(value) { | |
return A3( f, d1(value), d2(value), d3(value) ); | |
}; | |
} | |
function decodeObject4(f, d1, d2, d3, d4) { | |
return function(value) { | |
return A4( f, d1(value), d2(value), d3(value), d4(value) ); | |
}; | |
} | |
function decodeObject5(f, d1, d2, d3, d4, d5) { | |
return function(value) { | |
return A5( f, d1(value), d2(value), d3(value), d4(value), d5(value) ); | |
}; | |
} | |
function decodeObject6(f, d1, d2, d3, d4, d5, d6) { | |
return function(value) { | |
return A6( f, | |
d1(value), | |
d2(value), | |
d3(value), | |
d4(value), | |
d5(value), | |
d6(value) | |
); | |
}; | |
} | |
function decodeObject7(f, d1, d2, d3, d4, d5, d6, d7) { | |
return function(value) { | |
return A7( f, | |
d1(value), | |
d2(value), | |
d3(value), | |
d4(value), | |
d5(value), | |
d6(value), | |
d7(value) | |
); | |
}; | |
} | |
function decodeObject8(f, d1, d2, d3, d4, d5, d6, d7, d8) { | |
return function(value) { | |
return A8( f, | |
d1(value), | |
d2(value), | |
d3(value), | |
d4(value), | |
d5(value), | |
d6(value), | |
d7(value), | |
d8(value) | |
); | |
}; | |
} | |
// TUPLES | |
function decodeTuple1(f, d1) { | |
return function(value) { | |
if ( !(value instanceof Array) || value.length !== 1 ) { | |
crash('a Tuple of length 1', value); | |
} | |
return f( d1(value[0]) ); | |
}; | |
} | |
function decodeTuple2(f, d1, d2) { | |
return function(value) { | |
if ( !(value instanceof Array) || value.length !== 2 ) { | |
crash('a Tuple of length 2', value); | |
} | |
return A2( f, d1(value[0]), d2(value[1]) ); | |
}; | |
} | |
function decodeTuple3(f, d1, d2, d3) { | |
return function(value) { | |
if ( !(value instanceof Array) || value.length !== 3 ) { | |
crash('a Tuple of length 3', value); | |
} | |
return A3( f, d1(value[0]), d2(value[1]), d3(value[2]) ); | |
}; | |
} | |
function decodeTuple4(f, d1, d2, d3, d4) { | |
return function(value) { | |
if ( !(value instanceof Array) || value.length !== 4 ) { | |
crash('a Tuple of length 4', value); | |
} | |
return A4( f, d1(value[0]), d2(value[1]), d3(value[2]), d4(value[3]) ); | |
}; | |
} | |
function decodeTuple5(f, d1, d2, d3, d4, d5) { | |
return function(value) { | |
if ( !(value instanceof Array) || value.length !== 5 ) { | |
crash('a Tuple of length 5', value); | |
} | |
return A5( f, | |
d1(value[0]), | |
d2(value[1]), | |
d3(value[2]), | |
d4(value[3]), | |
d5(value[4]) | |
); | |
}; | |
} | |
function decodeTuple6(f, d1, d2, d3, d4, d5, d6) { | |
return function(value) { | |
if ( !(value instanceof Array) || value.length !== 6 ) { | |
crash('a Tuple of length 6', value); | |
} | |
return A6( f, | |
d1(value[0]), | |
d2(value[1]), | |
d3(value[2]), | |
d4(value[3]), | |
d5(value[4]), | |
d6(value[5]) | |
); | |
}; | |
} | |
function decodeTuple7(f, d1, d2, d3, d4, d5, d6, d7) { | |
return function(value) { | |
if ( !(value instanceof Array) || value.length !== 7 ) { | |
crash('a Tuple of length 7', value); | |
} | |
return A7( f, | |
d1(value[0]), | |
d2(value[1]), | |
d3(value[2]), | |
d4(value[3]), | |
d5(value[4]), | |
d6(value[5]), | |
d7(value[6]) | |
); | |
}; | |
} | |
function decodeTuple8(f, d1, d2, d3, d4, d5, d6, d7, d8) { | |
return function(value) { | |
if ( !(value instanceof Array) || value.length !== 8 ) { | |
crash('a Tuple of length 8', value); | |
} | |
return A8( f, | |
d1(value[0]), | |
d2(value[1]), | |
d3(value[2]), | |
d4(value[3]), | |
d5(value[4]), | |
d6(value[5]), | |
d7(value[6]), | |
d8(value[7]) | |
); | |
}; | |
} | |
// CUSTOM DECODERS | |
function decodeValue(value) { | |
return value; | |
} | |
function runDecoderValue(decoder, value) { | |
try { | |
return Result.Ok(decoder(value)); | |
} catch(e) { | |
return Result.Err(e.message); | |
} | |
} | |
function customDecoder(decoder, callback) { | |
return function(value) { | |
var result = callback(decoder(value)); | |
if (result.ctor === 'Err') { | |
throw new Error('custom decoder failed: ' + result._0); | |
} | |
return result._0; | |
}; | |
} | |
function andThen(decode, callback) { | |
return function(value) { | |
var result = decode(value); | |
return callback(result)(value); | |
}; | |
} | |
function fail(msg) { | |
return function(value) { | |
throw new Error(msg); | |
}; | |
} | |
function succeed(successValue) { | |
return function(value) { | |
return successValue; | |
}; | |
} | |
// ONE OF MANY | |
function oneOf(decoders) { | |
return function(value) { | |
var errors = []; | |
var temp = decoders; | |
while (temp.ctor !== '[]') { | |
try { | |
return temp._0(value); | |
} catch(e) { | |
errors.push(e.message); | |
} | |
temp = temp._1; | |
} | |
throw new Error('expecting one of the following:\n ' + errors.join('\n ')); | |
}; | |
} | |
function get(decoder, value) { | |
try { | |
return Result.Ok(decoder(value)); | |
} catch(e) { | |
return Result.Err(e.message); | |
} | |
} | |
// ENCODE / DECODE | |
function runDecoderString(decoder, string) { | |
try { | |
return Result.Ok(decoder(JSON.parse(string))); | |
} catch(e) { | |
return Result.Err(e.message); | |
} | |
} | |
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 localRuntime.Native.Json.values = { | |
encode: F2(encode), | |
runDecoderString: F2(runDecoderString), | |
runDecoderValue: F2(runDecoderValue), | |
get: F2(get), | |
oneOf: oneOf, | |
decodeNull: decodeNull, | |
decodeInt: decodeInt, | |
decodeFloat: decodeFloat, | |
decodeString: decodeString, | |
decodeBool: decodeBool, | |
decodeMaybe: decodeMaybe, | |
decodeList: decodeList, | |
decodeArray: decodeArray, | |
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), | |
decodeValue: decodeValue, | |
customDecoder: F2(customDecoder), | |
fail: fail, | |
succeed: succeed, | |
identity: identity, | |
encodeNull: null, | |
encodeArray: ElmArray.toJSArray, | |
encodeList: List.toArray, | |
encodeObject: encodeObject | |
}; | |
}; | |
Elm.Json = Elm.Json || {}; | |
Elm.Json.Encode = Elm.Json.Encode || {}; | |
Elm.Json.Encode.make = function (_elm) { | |
"use strict"; | |
_elm.Json = _elm.Json || {}; | |
_elm.Json.Encode = _elm.Json.Encode || {}; | |
if (_elm.Json.Encode.values) return _elm.Json.Encode.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Array = Elm.Array.make(_elm), | |
$Native$Json = Elm.Native.Json.make(_elm); | |
var _op = {}; | |
var list = $Native$Json.encodeList; | |
var array = $Native$Json.encodeArray; | |
var object = $Native$Json.encodeObject; | |
var $null = $Native$Json.encodeNull; | |
var bool = $Native$Json.identity; | |
var $float = $Native$Json.identity; | |
var $int = $Native$Json.identity; | |
var string = $Native$Json.identity; | |
var encode = $Native$Json.encode; | |
var Value = {ctor: "Value"}; | |
return _elm.Json.Encode.values = {_op: _op | |
,encode: encode | |
,string: string | |
,$int: $int | |
,$float: $float | |
,bool: bool | |
,$null: $null | |
,list: list | |
,array: array | |
,object: object}; | |
}; | |
Elm.Json = Elm.Json || {}; | |
Elm.Json.Decode = Elm.Json.Decode || {}; | |
Elm.Json.Decode.make = function (_elm) { | |
"use strict"; | |
_elm.Json = _elm.Json || {}; | |
_elm.Json.Decode = _elm.Json.Decode || {}; | |
if (_elm.Json.Decode.values) return _elm.Json.Decode.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Array = Elm.Array.make(_elm), | |
$Dict = Elm.Dict.make(_elm), | |
$Json$Encode = Elm.Json.Encode.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Native$Json = Elm.Native.Json.make(_elm), | |
$Result = Elm.Result.make(_elm); | |
var _op = {}; | |
var tuple8 = $Native$Json.decodeTuple8; | |
var tuple7 = $Native$Json.decodeTuple7; | |
var tuple6 = $Native$Json.decodeTuple6; | |
var tuple5 = $Native$Json.decodeTuple5; | |
var tuple4 = $Native$Json.decodeTuple4; | |
var tuple3 = $Native$Json.decodeTuple3; | |
var tuple2 = $Native$Json.decodeTuple2; | |
var tuple1 = $Native$Json.decodeTuple1; | |
var succeed = $Native$Json.succeed; | |
var fail = $Native$Json.fail; | |
var andThen = $Native$Json.andThen; | |
var customDecoder = $Native$Json.customDecoder; | |
var decodeValue = $Native$Json.runDecoderValue; | |
var value = $Native$Json.decodeValue; | |
var maybe = $Native$Json.decodeMaybe; | |
var $null = $Native$Json.decodeNull; | |
var array = $Native$Json.decodeArray; | |
var list = $Native$Json.decodeList; | |
var bool = $Native$Json.decodeBool; | |
var $int = $Native$Json.decodeInt; | |
var $float = $Native$Json.decodeFloat; | |
var string = $Native$Json.decodeString; | |
var oneOf = $Native$Json.oneOf; | |
var keyValuePairs = $Native$Json.decodeKeyValuePairs; | |
var object8 = $Native$Json.decodeObject8; | |
var object7 = $Native$Json.decodeObject7; | |
var object6 = $Native$Json.decodeObject6; | |
var object5 = $Native$Json.decodeObject5; | |
var object4 = $Native$Json.decodeObject4; | |
var object3 = $Native$Json.decodeObject3; | |
var object2 = $Native$Json.decodeObject2; | |
var object1 = $Native$Json.decodeObject1; | |
_op[":="] = $Native$Json.decodeField; | |
var at = F2(function (fields,decoder) { | |
return A3($List.foldr, | |
F2(function (x,y) { return A2(_op[":="],x,y);}), | |
decoder, | |
fields); | |
}); | |
var decodeString = $Native$Json.runDecoderString; | |
var map = $Native$Json.decodeObject1; | |
var dict = function (decoder) { | |
return A2(map,$Dict.fromList,keyValuePairs(decoder)); | |
}; | |
var Decoder = {ctor: "Decoder"}; | |
return _elm.Json.Decode.values = {_op: _op | |
,decodeString: decodeString | |
,decodeValue: decodeValue | |
,string: string | |
,$int: $int | |
,$float: $float | |
,bool: bool | |
,$null: $null | |
,list: list | |
,array: array | |
,tuple1: tuple1 | |
,tuple2: tuple2 | |
,tuple3: tuple3 | |
,tuple4: tuple4 | |
,tuple5: tuple5 | |
,tuple6: tuple6 | |
,tuple7: tuple7 | |
,tuple8: tuple8 | |
,at: at | |
,object1: object1 | |
,object2: object2 | |
,object3: object3 | |
,object4: object4 | |
,object5: object5 | |
,object6: object6 | |
,object7: object7 | |
,object8: object8 | |
,keyValuePairs: keyValuePairs | |
,dict: dict | |
,maybe: maybe | |
,oneOf: oneOf | |
,map: map | |
,fail: fail | |
,succeed: succeed | |
,andThen: andThen | |
,value: value | |
,customDecoder: customDecoder}; | |
}; | |
Elm.Native = Elm.Native || {}; | |
Elm.Native.Mouse = {}; | |
Elm.Native.Mouse.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Mouse = localRuntime.Native.Mouse || {}; | |
if (localRuntime.Native.Mouse.values) | |
{ | |
return localRuntime.Native.Mouse.values; | |
} | |
var NS = Elm.Native.Signal.make(localRuntime); | |
var Utils = Elm.Native.Utils.make(localRuntime); | |
var position = NS.input('Mouse.position', Utils.Tuple2(0, 0)); | |
var isDown = NS.input('Mouse.isDown', false); | |
var clicks = NS.input('Mouse.clicks', Utils.Tuple0); | |
var node = localRuntime.isFullscreen() | |
? document | |
: localRuntime.node; | |
localRuntime.addListener([clicks.id], node, 'click', function click() { | |
localRuntime.notify(clicks.id, Utils.Tuple0); | |
}); | |
localRuntime.addListener([isDown.id], node, 'mousedown', function down() { | |
localRuntime.notify(isDown.id, true); | |
}); | |
localRuntime.addListener([isDown.id], node, 'mouseup', function up() { | |
localRuntime.notify(isDown.id, false); | |
}); | |
localRuntime.addListener([position.id], node, 'mousemove', function move(e) { | |
localRuntime.notify(position.id, Utils.getXY(e)); | |
}); | |
return localRuntime.Native.Mouse.values = { | |
position: position, | |
isDown: isDown, | |
clicks: clicks | |
}; | |
}; | |
Elm.Mouse = Elm.Mouse || {}; | |
Elm.Mouse.make = function (_elm) { | |
"use strict"; | |
_elm.Mouse = _elm.Mouse || {}; | |
if (_elm.Mouse.values) return _elm.Mouse.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Native$Mouse = Elm.Native.Mouse.make(_elm), | |
$Signal = Elm.Signal.make(_elm); | |
var _op = {}; | |
var clicks = $Native$Mouse.clicks; | |
var isDown = $Native$Mouse.isDown; | |
var position = $Native$Mouse.position; | |
var x = A2($Signal.map,$Basics.fst,position); | |
var y = A2($Signal.map,$Basics.snd,position); | |
return _elm.Mouse.values = {_op: _op | |
,position: position | |
,x: x | |
,y: y | |
,isDown: isDown | |
,clicks: clicks}; | |
}; | |
Elm.Native = Elm.Native || {}; | |
Elm.Native.Window = {}; | |
Elm.Native.Window.make = function make(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Window = localRuntime.Native.Window || {}; | |
if (localRuntime.Native.Window.values) | |
{ | |
return localRuntime.Native.Window.values; | |
} | |
var NS = Elm.Native.Signal.make(localRuntime); | |
var Tuple2 = Elm.Native.Utils.make(localRuntime).Tuple2; | |
function getWidth() | |
{ | |
return localRuntime.node.clientWidth; | |
} | |
function getHeight() | |
{ | |
if (localRuntime.isFullscreen()) | |
{ | |
return window.innerHeight; | |
} | |
return localRuntime.node.clientHeight; | |
} | |
var dimensions = NS.input('Window.dimensions', Tuple2(getWidth(), getHeight())); | |
function resizeIfNeeded() | |
{ | |
// Do not trigger event if the dimensions have not changed. | |
// This should be most of the time. | |
var w = getWidth(); | |
var h = getHeight(); | |
if (dimensions.value._0 === w && dimensions.value._1 === h) | |
{ | |
return; | |
} | |
setTimeout(function() { | |
// Check again to see if the dimensions have changed. | |
// It is conceivable that the dimensions have changed | |
// again while some other event was being processed. | |
w = getWidth(); | |
h = getHeight(); | |
if (dimensions.value._0 === w && dimensions.value._1 === h) | |
{ | |
return; | |
} | |
localRuntime.notify(dimensions.id, Tuple2(w, h)); | |
}, 0); | |
} | |
localRuntime.addListener([dimensions.id], window, 'resize', resizeIfNeeded); | |
return localRuntime.Native.Window.values = { | |
dimensions: dimensions, | |
resizeIfNeeded: resizeIfNeeded | |
}; | |
}; | |
Elm.Window = Elm.Window || {}; | |
Elm.Window.make = function (_elm) { | |
"use strict"; | |
_elm.Window = _elm.Window || {}; | |
if (_elm.Window.values) return _elm.Window.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Native$Window = Elm.Native.Window.make(_elm), | |
$Signal = Elm.Signal.make(_elm); | |
var _op = {}; | |
var dimensions = $Native$Window.dimensions; | |
var width = A2($Signal.map,$Basics.fst,dimensions); | |
var height = A2($Signal.map,$Basics.snd,dimensions); | |
return _elm.Window.values = {_op: _op | |
,dimensions: dimensions | |
,width: width | |
,height: height}; | |
}; | |
Elm.Automaton = Elm.Automaton || {}; | |
Elm.Automaton.make = function (_elm) { | |
"use strict"; | |
_elm.Automaton = _elm.Automaton || {}; | |
if (_elm.Automaton.values) return _elm.Automaton.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Signal = Elm.Signal.make(_elm); | |
var _op = {}; | |
var dequeue = function (q) { | |
dequeue: while (true) { | |
var _p0 = q; | |
if (_p0._1.ctor === "[]") { | |
if (_p0._0.ctor === "[]") { | |
return $Maybe.Nothing; | |
} else { | |
var _v1 = {ctor: "_Tuple2" | |
,_0: _U.list([]) | |
,_1: $List.reverse(_p0._0)}; | |
q = _v1; | |
continue dequeue; | |
} | |
} else { | |
return $Maybe.Just({ctor: "_Tuple2" | |
,_0: _p0._1._0 | |
,_1: {ctor: "_Tuple2",_0: _p0._0,_1: _p0._1._1}}); | |
} | |
} | |
}; | |
var enqueue = F2(function (x,_p1) { | |
var _p2 = _p1; | |
return {ctor: "_Tuple2" | |
,_0: A2($List._op["::"],x,_p2._0) | |
,_1: _p2._1}; | |
}); | |
var empty = {ctor: "_Tuple2",_0: _U.list([]),_1: _U.list([])}; | |
var step = F2(function (a,_p3) { | |
var _p4 = _p3; | |
return _p4._0(a); | |
}); | |
var run = F3(function (auto,base,inputs) { | |
var step = F2(function (a,_p5) { | |
var _p6 = _p5; | |
return _p6._0._0(a); | |
}); | |
return A2($Signal.map, | |
function (_p7) { | |
var _p8 = _p7; | |
return _p8._1; | |
}, | |
A3($Signal.foldp, | |
step, | |
{ctor: "_Tuple2",_0: auto,_1: base}, | |
inputs)); | |
}); | |
var Step = function (a) { return {ctor: "Step",_0: a};}; | |
_op[">>>"] = F2(function (f,g) { | |
return Step(function (a) { | |
var _p9 = A2(step,a,f); | |
var f$ = _p9._0; | |
var b = _p9._1; | |
var _p10 = A2(step,b,g); | |
var g$ = _p10._0; | |
var c = _p10._1; | |
return {ctor: "_Tuple2",_0: A2(_op[">>>"],f$,g$),_1: c}; | |
}); | |
}); | |
_op["<<<"] = F2(function (g,f) { | |
return Step(function (a) { | |
var _p11 = A2(step,a,f); | |
var f$ = _p11._0; | |
var b = _p11._1; | |
var _p12 = A2(step,b,g); | |
var g$ = _p12._0; | |
var c = _p12._1; | |
return {ctor: "_Tuple2",_0: A2(_op["<<<"],g$,f$),_1: c}; | |
}); | |
}); | |
var branch = F2(function (f,g) { | |
return Step(function (a) { | |
var _p13 = A2(step,a,g); | |
var g$ = _p13._0; | |
var c = _p13._1; | |
var _p14 = A2(step,a,f); | |
var f$ = _p14._0; | |
var b = _p14._1; | |
return {ctor: "_Tuple2" | |
,_0: A2(branch,f$,g$) | |
,_1: {ctor: "_Tuple2",_0: b,_1: c}}; | |
}); | |
}); | |
var pair = F2(function (f,g) { | |
return Step(function (_p15) { | |
var _p16 = _p15; | |
var _p17 = A2(step,_p16._1,g); | |
var g$ = _p17._0; | |
var d = _p17._1; | |
var _p18 = A2(step,_p16._0,f); | |
var f$ = _p18._0; | |
var c = _p18._1; | |
return {ctor: "_Tuple2" | |
,_0: A2(pair,f$,g$) | |
,_1: {ctor: "_Tuple2",_0: c,_1: d}}; | |
}); | |
}); | |
var first = function (auto) { | |
return Step(function (_p19) { | |
var _p20 = _p19; | |
var _p21 = A2(step,_p20._0,auto); | |
var f = _p21._0; | |
var o = _p21._1; | |
return {ctor: "_Tuple2" | |
,_0: first(f) | |
,_1: {ctor: "_Tuple2",_0: o,_1: _p20._1}}; | |
}); | |
}; | |
var second = function (auto) { | |
return Step(function (_p22) { | |
var _p23 = _p22; | |
var _p24 = A2(step,_p23._1,auto); | |
var f = _p24._0; | |
var o = _p24._1; | |
return {ctor: "_Tuple2" | |
,_0: second(f) | |
,_1: {ctor: "_Tuple2",_0: _p23._0,_1: o}}; | |
}); | |
}; | |
var loop = F2(function (state,auto) { | |
return Step(function (input) { | |
var _p25 = A2(step, | |
{ctor: "_Tuple2",_0: input,_1: state}, | |
auto); | |
var auto$ = _p25._0; | |
var output = _p25._1._0; | |
var state$ = _p25._1._1; | |
return {ctor: "_Tuple2",_0: A2(loop,state$,auto$),_1: output}; | |
}); | |
}); | |
var combine = function (autos) { | |
return Step(function (a) { | |
var _p26 = $List.unzip(A2($List.map,step(a),autos)); | |
var autos$ = _p26._0; | |
var bs = _p26._1; | |
return {ctor: "_Tuple2",_0: combine(autos$),_1: bs}; | |
}); | |
}; | |
var pure = function (f) { | |
return Step(function (x) { | |
return {ctor: "_Tuple2",_0: pure(f),_1: f(x)}; | |
}); | |
}; | |
var merge = function (f) { return pure($Basics.uncurry(f));}; | |
var state = F2(function (s,f) { | |
return Step(function (x) { | |
var s$ = A2(f,x,s); | |
return {ctor: "_Tuple2",_0: A2(state,s$,f),_1: s$}; | |
}); | |
}); | |
var count = A2(state, | |
0, | |
F2(function (_p27,c) { return c + 1;})); | |
var hiddenState = F2(function (s,f) { | |
return Step(function (x) { | |
var _p28 = A2(f,x,s); | |
var s$ = _p28._0; | |
var out = _p28._1; | |
return {ctor: "_Tuple2",_0: A2(hiddenState,out,f),_1: s$}; | |
}); | |
}); | |
var average = function (k) { | |
var stepFull = F2(function (n,_p29) { | |
var _p30 = _p29; | |
var _p34 = _p30._2; | |
var _p33 = _p30._0; | |
var _p32 = _p30._1; | |
var _p31 = dequeue(_p33); | |
if (_p31.ctor === "Nothing") { | |
return {ctor: "_Tuple2" | |
,_0: 0 | |
,_1: {ctor: "_Tuple3",_0: _p33,_1: _p32,_2: _p34}}; | |
} else { | |
var sum$ = _p34 + n - _p31._0._0; | |
return {ctor: "_Tuple2" | |
,_0: sum$ / $Basics.toFloat(_p32) | |
,_1: {ctor: "_Tuple3" | |
,_0: A2(enqueue,n,_p31._0._1) | |
,_1: _p32 | |
,_2: sum$}}; | |
} | |
}); | |
var step = F2(function (n,_p35) { | |
var _p36 = _p35; | |
var _p39 = _p36._2; | |
var _p38 = _p36._0; | |
var _p37 = _p36._1; | |
return _U.eq(_p37,k) ? A2(stepFull, | |
n, | |
{ctor: "_Tuple3",_0: _p38,_1: _p37,_2: _p39}) : {ctor: "_Tuple2" | |
,_0: (_p39 + n) / ($Basics.toFloat(_p37) + 1) | |
,_1: {ctor: "_Tuple3" | |
,_0: A2(enqueue,n,_p38) | |
,_1: _p37 + 1 | |
,_2: _p39 + n}}; | |
}); | |
return A2(hiddenState, | |
{ctor: "_Tuple3",_0: empty,_1: 0,_2: 0}, | |
step); | |
}; | |
return _elm.Automaton.values = {_op: _op | |
,pure: pure | |
,state: state | |
,hiddenState: hiddenState | |
,run: run | |
,step: step | |
,branch: branch | |
,pair: pair | |
,merge: merge | |
,first: first | |
,second: second | |
,combine: combine | |
,loop: loop | |
,count: count | |
,average: average}; | |
}; | |
Elm.Native.Effects = {}; | |
Elm.Native.Effects.make = function(localRuntime) { | |
localRuntime.Native = localRuntime.Native || {}; | |
localRuntime.Native.Effects = localRuntime.Native.Effects || {}; | |
if (localRuntime.Native.Effects.values) | |
{ | |
return localRuntime.Native.Effects.values; | |
} | |
var Task = Elm.Native.Task.make(localRuntime); | |
var Utils = Elm.Native.Utils.make(localRuntime); | |
var Signal = Elm.Signal.make(localRuntime); | |
var List = Elm.Native.List.make(localRuntime); | |
// polyfill so things will work even if rAF is not available for some reason | |
var _requestAnimationFrame = | |
typeof requestAnimationFrame !== 'undefined' | |
? requestAnimationFrame | |
: function(cb) { setTimeout(cb, 1000 / 60); } | |
; | |
// batchedSending and sendCallback implement a small state machine in order | |
// to schedule only one send(time) call per animation frame. | |
// | |
// Invariants: | |
// 1. In the NO_REQUEST state, there is never a scheduled sendCallback. | |
// 2. In the PENDING_REQUEST and EXTRA_REQUEST states, there is always exactly | |
// one scheduled sendCallback. | |
var NO_REQUEST = 0; | |
var PENDING_REQUEST = 1; | |
var EXTRA_REQUEST = 2; | |
var state = NO_REQUEST; | |
var messageArray = []; | |
function batchedSending(address, tickMessages) | |
{ | |
// insert ticks into the messageArray | |
var foundAddress = false; | |
for (var i = messageArray.length; i--; ) | |
{ | |
if (messageArray[i].address === address) | |
{ | |
foundAddress = true; | |
messageArray[i].tickMessages = A3(List.foldl, List.cons, messageArray[i].tickMessages, tickMessages); | |
break; | |
} | |
} | |
if (!foundAddress) | |
{ | |
messageArray.push({ address: address, tickMessages: tickMessages }); | |
} | |
// do the appropriate state transition | |
switch (state) | |
{ | |
case NO_REQUEST: | |
_requestAnimationFrame(sendCallback); | |
state = PENDING_REQUEST; | |
break; | |
case PENDING_REQUEST: | |
state = PENDING_REQUEST; | |
break; | |
case EXTRA_REQUEST: | |
state = PENDING_REQUEST; | |
break; | |
} | |
} | |
function sendCallback(time) | |
{ | |
switch (state) | |
{ | |
case NO_REQUEST: | |
// This state should not be possible. How can there be no | |
// request, yet somehow we are actively fulfilling a | |
// request? | |
throw new Error( | |
'Unexpected send callback.\n' + | |
'Please report this to <https://github.com/evancz/elm-effects/issues>.' | |
); | |
case PENDING_REQUEST: | |
// At this point, we do not *know* that another frame is | |
// needed, but we make an extra request to rAF just in | |
// case. It's possible to drop a frame if rAF is called | |
// too late, so we just do it preemptively. | |
_requestAnimationFrame(sendCallback); | |
state = EXTRA_REQUEST; | |
// There's also stuff we definitely need to send. | |
send(time); | |
return; | |
case EXTRA_REQUEST: | |
// Turns out the extra request was not needed, so we will | |
// stop calling rAF. No reason to call it all the time if | |
// no one needs it. | |
state = NO_REQUEST; | |
return; | |
} | |
} | |
function send(time) | |
{ | |
for (var i = messageArray.length; i--; ) | |
{ | |
var messages = A3( | |
List.foldl, | |
F2( function(toAction, list) { return List.Cons(toAction(time), list); } ), | |
List.Nil, | |
messageArray[i].tickMessages | |
); | |
Task.perform( A2(Signal.send, messageArray[i].address, messages) ); | |
} | |
messageArray = []; | |
} | |
function requestTickSending(address, tickMessages) | |
{ | |
return Task.asyncFunction(function(callback) { | |
batchedSending(address, tickMessages); | |
callback(Task.succeed(Utils.Tuple0)); | |
}); | |
} | |
return localRuntime.Native.Effects.values = { | |
requestTickSending: F2(requestTickSending) | |
}; | |
}; | |
Elm.Effects = Elm.Effects || {}; | |
Elm.Effects.make = function (_elm) { | |
"use strict"; | |
_elm.Effects = _elm.Effects || {}; | |
if (_elm.Effects.values) return _elm.Effects.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Native$Effects = Elm.Native.Effects.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Signal = Elm.Signal.make(_elm), | |
$Task = Elm.Task.make(_elm), | |
$Time = Elm.Time.make(_elm); | |
var _op = {}; | |
var ignore = function (task) { | |
return A2($Task.map,$Basics.always({ctor: "_Tuple0"}),task); | |
}; | |
var requestTickSending = $Native$Effects.requestTickSending; | |
var toTaskHelp = F3(function (address,effect,_p0) { | |
var _p1 = _p0; | |
var _p5 = _p1._1; | |
var _p4 = _p1; | |
var _p3 = _p1._0; | |
var _p2 = effect; | |
switch (_p2.ctor) | |
{case "Task": var reporter = A2($Task.andThen, | |
_p2._0, | |
function (answer) { | |
return A2($Signal.send,address,_U.list([answer])); | |
}); | |
return {ctor: "_Tuple2" | |
,_0: A2($Task.andThen, | |
_p3, | |
$Basics.always(ignore($Task.spawn(reporter)))) | |
,_1: _p5}; | |
case "Tick": return {ctor: "_Tuple2" | |
,_0: _p3 | |
,_1: A2($List._op["::"],_p2._0,_p5)}; | |
case "None": return _p4; | |
default: return A3($List.foldl,toTaskHelp(address),_p4,_p2._0);} | |
}); | |
var toTask = F2(function (address,effect) { | |
var _p6 = A3(toTaskHelp, | |
address, | |
effect, | |
{ctor: "_Tuple2" | |
,_0: $Task.succeed({ctor: "_Tuple0"}) | |
,_1: _U.list([])}); | |
var combinedTask = _p6._0; | |
var tickMessages = _p6._1; | |
return $List.isEmpty(tickMessages) ? combinedTask : A2($Task.andThen, | |
combinedTask, | |
$Basics.always(A2(requestTickSending,address,tickMessages))); | |
}); | |
var Never = function (a) { return {ctor: "Never",_0: a};}; | |
var Batch = function (a) { return {ctor: "Batch",_0: a};}; | |
var batch = Batch; | |
var None = {ctor: "None"}; | |
var none = None; | |
var Tick = function (a) { return {ctor: "Tick",_0: a};}; | |
var tick = Tick; | |
var Task = function (a) { return {ctor: "Task",_0: a};}; | |
var task = Task; | |
var map = F2(function (func,effect) { | |
var _p7 = effect; | |
switch (_p7.ctor) | |
{case "Task": return Task(A2($Task.map,func,_p7._0)); | |
case "Tick": return Tick(function (_p8) { | |
return func(_p7._0(_p8)); | |
}); | |
case "None": return None; | |
default: return Batch(A2($List.map,map(func),_p7._0));} | |
}); | |
return _elm.Effects.values = {_op: _op | |
,none: none | |
,task: task | |
,tick: tick | |
,map: map | |
,batch: batch | |
,toTask: toTask}; | |
}; | |
(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | |
},{}],2:[function(require,module,exports){ | |
(function (global){ | |
var topLevel = typeof global !== 'undefined' ? global : | |
typeof window !== 'undefined' ? window : {} | |
var minDoc = require('min-document'); | |
if (typeof document !== 'undefined') { | |
module.exports = document; | |
} else { | |
var doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4']; | |
if (!doccy) { | |
doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc; | |
} | |
module.exports = doccy; | |
} | |
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) | |
},{"min-document":1}],3:[function(require,module,exports){ | |
"use strict"; | |
module.exports = function isObject(x) { | |
return typeof x === "object" && x !== null; | |
}; | |
},{}],4:[function(require,module,exports){ | |
var nativeIsArray = Array.isArray | |
var toString = Object.prototype.toString | |
module.exports = nativeIsArray || isArray | |
function isArray(obj) { | |
return toString.call(obj) === "[object Array]" | |
} | |
},{}],5:[function(require,module,exports){ | |
var isObject = require("is-object") | |
var isHook = require("../vnode/is-vhook.js") | |
module.exports = applyProperties | |
function applyProperties(node, props, previous) { | |
for (var propName in props) { | |
var propValue = props[propName] | |
if (propValue === undefined) { | |
removeProperty(node, propName, propValue, previous); | |
} else if (isHook(propValue)) { | |
removeProperty(node, propName, propValue, previous) | |
if (propValue.hook) { | |
propValue.hook(node, | |
propName, | |
previous ? previous[propName] : undefined) | |
} | |
} else { | |
if (isObject(propValue)) { | |
patchObject(node, props, previous, propName, propValue); | |
} else { | |
node[propName] = propValue | |
} | |
} | |
} | |
} | |
function removeProperty(node, propName, propValue, previous) { | |
if (previous) { | |
var previousValue = previous[propName] | |
if (!isHook(previousValue)) { | |
if (propName === "attributes") { | |
for (var attrName in previousValue) { | |
node.removeAttribute(attrName) | |
} | |
} else if (propName === "style") { | |
for (var i in previousValue) { | |
node.style[i] = "" | |
} | |
} else if (typeof previousValue === "string") { | |
node[propName] = "" | |
} else { | |
node[propName] = null | |
} | |
} else if (previousValue.unhook) { | |
previousValue.unhook(node, propName, propValue) | |
} | |
} | |
} | |
function patchObject(node, props, previous, propName, propValue) { | |
var previousValue = previous ? previous[propName] : undefined | |
// Set attributes | |
if (propName === "attributes") { | |
for (var attrName in propValue) { | |
var attrValue = propValue[attrName] | |
if (attrValue === undefined) { | |
node.removeAttribute(attrName) | |
} else { | |
node.setAttribute(attrName, attrValue) | |
} | |
} | |
return | |
} | |
if(previousValue && isObject(previousValue) && | |
getPrototype(previousValue) !== getPrototype(propValue)) { | |
node[propName] = propValue | |
return | |
} | |
if (!isObject(node[propName])) { | |
node[propName] = {} | |
} | |
var replacer = propName === "style" ? "" : undefined | |
for (var k in propValue) { | |
var value = propValue[k] | |
node[propName][k] = (value === undefined) ? replacer : value | |
} | |
} | |
function getPrototype(value) { | |
if (Object.getPrototypeOf) { | |
return Object.getPrototypeOf(value) | |
} else if (value.__proto__) { | |
return value.__proto__ | |
} else if (value.constructor) { | |
return value.constructor.prototype | |
} | |
} | |
},{"../vnode/is-vhook.js":13,"is-object":3}],6:[function(require,module,exports){ | |
var document = require("global/document") | |
var applyProperties = require("./apply-properties") | |
var isVNode = require("../vnode/is-vnode.js") | |
var isVText = require("../vnode/is-vtext.js") | |
var isWidget = require("../vnode/is-widget.js") | |
var handleThunk = require("../vnode/handle-thunk.js") | |
module.exports = createElement | |
function createElement(vnode, opts) { | |
var doc = opts ? opts.document || document : document | |
var warn = opts ? opts.warn : null | |
vnode = handleThunk(vnode).a | |
if (isWidget(vnode)) { | |
return vnode.init() | |
} else if (isVText(vnode)) { | |
return doc.createTextNode(vnode.text) | |
} else if (!isVNode(vnode)) { | |
if (warn) { | |
warn("Item is not a valid virtual dom node", vnode) | |
} | |
return null | |
} | |
var node = (vnode.namespace === null) ? | |
doc.createElement(vnode.tagName) : | |
doc.createElementNS(vnode.namespace, vnode.tagName) | |
var props = vnode.properties | |
applyProperties(node, props) | |
var children = vnode.children | |
for (var i = 0; i < children.length; i++) { | |
var childNode = createElement(children[i], opts) | |
if (childNode) { | |
node.appendChild(childNode) | |
} | |
} | |
return node | |
} | |
},{"../vnode/handle-thunk.js":11,"../vnode/is-vnode.js":14,"../vnode/is-vtext.js":15,"../vnode/is-widget.js":16,"./apply-properties":5,"global/document":2}],7:[function(require,module,exports){ | |
// Maps a virtual DOM tree onto a real DOM tree in an efficient manner. | |
// We don't want to read all of the DOM nodes in the tree so we use | |
// the in-order tree indexing to eliminate recursion down certain branches. | |
// We only recurse into a DOM node if we know that it contains a child of | |
// interest. | |
var noChild = {} | |
module.exports = domIndex | |
function domIndex(rootNode, tree, indices, nodes) { | |
if (!indices || indices.length === 0) { | |
return {} | |
} else { | |
indices.sort(ascending) | |
return recurse(rootNode, tree, indices, nodes, 0) | |
} | |
} | |
function recurse(rootNode, tree, indices, nodes, rootIndex) { | |
nodes = nodes || {} | |
if (rootNode) { | |
if (indexInRange(indices, rootIndex, rootIndex)) { | |
nodes[rootIndex] = rootNode | |
} | |
var vChildren = tree.children | |
if (vChildren) { | |
var childNodes = rootNode.childNodes | |
for (var i = 0; i < tree.children.length; i++) { | |
rootIndex += 1 | |
var vChild = vChildren[i] || noChild | |
var nextIndex = rootIndex + (vChild.count || 0) | |
// skip recursion down the tree if there are no nodes down here | |
if (indexInRange(indices, rootIndex, nextIndex)) { | |
recurse(childNodes[i], vChild, indices, nodes, rootIndex) | |
} | |
rootIndex = nextIndex | |
} | |
} | |
} | |
return nodes | |
} | |
// Binary search for an index in the interval [left, right] | |
function indexInRange(indices, left, right) { | |
if (indices.length === 0) { | |
return false | |
} | |
var minIndex = 0 | |
var maxIndex = indices.length - 1 | |
var currentIndex | |
var currentItem | |
while (minIndex <= maxIndex) { | |
currentIndex = ((maxIndex + minIndex) / 2) >> 0 | |
currentItem = indices[currentIndex] | |
if (minIndex === maxIndex) { | |
return currentItem >= left && currentItem <= right | |
} else if (currentItem < left) { | |
minIndex = currentIndex + 1 | |
} else if (currentItem > right) { | |
maxIndex = currentIndex - 1 | |
} else { | |
return true | |
} | |
} | |
return false; | |
} | |
function ascending(a, b) { | |
return a > b ? 1 : -1 | |
} | |
},{}],8:[function(require,module,exports){ | |
var applyProperties = require("./apply-properties") | |
var isWidget = require("../vnode/is-widget.js") | |
var VPatch = require("../vnode/vpatch.js") | |
var render = require("./create-element") | |
var updateWidget = require("./update-widget") | |
module.exports = applyPatch | |
function applyPatch(vpatch, domNode, renderOptions) { | |
var type = vpatch.type | |
var vNode = vpatch.vNode | |
var patch = vpatch.patch | |
switch (type) { | |
case VPatch.REMOVE: | |
return removeNode(domNode, vNode) | |
case VPatch.INSERT: | |
return insertNode(domNode, patch, renderOptions) | |
case VPatch.VTEXT: | |
return stringPatch(domNode, vNode, patch, renderOptions) | |
case VPatch.WIDGET: | |
return widgetPatch(domNode, vNode, patch, renderOptions) | |
case VPatch.VNODE: | |
return vNodePatch(domNode, vNode, patch, renderOptions) | |
case VPatch.ORDER: | |
reorderChildren(domNode, patch) | |
return domNode | |
case VPatch.PROPS: | |
applyProperties(domNode, patch, vNode.properties) | |
return domNode | |
case VPatch.THUNK: | |
return replaceRoot(domNode, | |
renderOptions.patch(domNode, patch, renderOptions)) | |
default: | |
return domNode | |
} | |
} | |
function removeNode(domNode, vNode) { | |
var parentNode = domNode.parentNode | |
if (parentNode) { | |
parentNode.removeChild(domNode) | |
} | |
destroyWidget(domNode, vNode); | |
return null | |
} | |
function insertNode(parentNode, vNode, renderOptions) { | |
var newNode = render(vNode, renderOptions) | |
if (parentNode) { | |
parentNode.appendChild(newNode) | |
} | |
return parentNode | |
} | |
function stringPatch(domNode, leftVNode, vText, renderOptions) { | |
var newNode | |
if (domNode.nodeType === 3) { | |
domNode.replaceData(0, domNode.length, vText.text) | |
newNode = domNode | |
} else { | |
var parentNode = domNode.parentNode | |
newNode = render(vText, renderOptions) | |
if (parentNode && newNode !== domNode) { | |
parentNode.replaceChild(newNode, domNode) | |
} | |
} | |
return newNode | |
} | |
function widgetPatch(domNode, leftVNode, widget, renderOptions) { | |
var updating = updateWidget(leftVNode, widget) | |
var newNode | |
if (updating) { | |
newNode = widget.update(leftVNode, domNode) || domNode | |
} else { | |
newNode = render(widget, renderOptions) | |
} | |
var parentNode = domNode.parentNode | |
if (parentNode && newNode !== domNode) { | |
parentNode.replaceChild(newNode, domNode) | |
} | |
if (!updating) { | |
destroyWidget(domNode, leftVNode) | |
} | |
return newNode | |
} | |
function vNodePatch(domNode, leftVNode, vNode, renderOptions) { | |
var parentNode = domNode.parentNode | |
var newNode = render(vNode, renderOptions) | |
if (parentNode && newNode !== domNode) { | |
parentNode.replaceChild(newNode, domNode) | |
} | |
return newNode | |
} | |
function destroyWidget(domNode, w) { | |
if (typeof w.destroy === "function" && isWidget(w)) { | |
w.destroy(domNode) | |
} | |
} | |
function reorderChildren(domNode, moves) { | |
var childNodes = domNode.childNodes | |
var keyMap = {} | |
var node | |
var remove | |
var insert | |
for (var i = 0; i < moves.removes.length; i++) { | |
remove = moves.removes[i] | |
node = childNodes[remove.from] | |
if (remove.key) { | |
keyMap[remove.key] = node | |
} | |
domNode.removeChild(node) | |
} | |
var length = childNodes.length | |
for (var j = 0; j < moves.inserts.length; j++) { | |
insert = moves.inserts[j] | |
node = keyMap[insert.key] | |
// this is the weirdest bug i've ever seen in webkit | |
domNode.insertBefore(node, insert.to >= length++ ? null : childNodes[insert.to]) | |
} | |
} | |
function replaceRoot(oldRoot, newRoot) { | |
if (oldRoot && newRoot && oldRoot !== newRoot && oldRoot.parentNode) { | |
oldRoot.parentNode.replaceChild(newRoot, oldRoot) | |
} | |
return newRoot; | |
} | |
},{"../vnode/is-widget.js":16,"../vnode/vpatch.js":19,"./apply-properties":5,"./create-element":6,"./update-widget":10}],9:[function(require,module,exports){ | |
var document = require("global/document") | |
var isArray = require("x-is-array") | |
var domIndex = require("./dom-index") | |
var patchOp = require("./patch-op") | |
module.exports = patch | |
function patch(rootNode, patches) { | |
return patchRecursive(rootNode, patches) | |
} | |
function patchRecursive(rootNode, patches, renderOptions) { | |
var indices = patchIndices(patches) | |
if (indices.length === 0) { | |
return rootNode | |
} | |
var index = domIndex(rootNode, patches.a, indices) | |
var ownerDocument = rootNode.ownerDocument | |
if (!renderOptions) { | |
renderOptions = { patch: patchRecursive } | |
if (ownerDocument !== document) { | |
renderOptions.document = ownerDocument | |
} | |
} | |
for (var i = 0; i < indices.length; i++) { | |
var nodeIndex = indices[i] | |
rootNode = applyPatch(rootNode, | |
index[nodeIndex], | |
patches[nodeIndex], | |
renderOptions) | |
} | |
return rootNode | |
} | |
function applyPatch(rootNode, domNode, patchList, renderOptions) { | |
if (!domNode) { | |
return rootNode | |
} | |
var newNode | |
if (isArray(patchList)) { | |
for (var i = 0; i < patchList.length; i++) { | |
newNode = patchOp(patchList[i], domNode, renderOptions) | |
if (domNode === rootNode) { | |
rootNode = newNode | |
} | |
} | |
} else { | |
newNode = patchOp(patchList, domNode, renderOptions) | |
if (domNode === rootNode) { | |
rootNode = newNode | |
} | |
} | |
return rootNode | |
} | |
function patchIndices(patches) { | |
var indices = [] | |
for (var key in patches) { | |
if (key !== "a") { | |
indices.push(Number(key)) | |
} | |
} | |
return indices | |
} | |
},{"./dom-index":7,"./patch-op":8,"global/document":2,"x-is-array":4}],10:[function(require,module,exports){ | |
var isWidget = require("../vnode/is-widget.js") | |
module.exports = updateWidget | |
function updateWidget(a, b) { | |
if (isWidget(a) && isWidget(b)) { | |
if ("name" in a && "name" in b) { | |
return a.id === b.id | |
} else { | |
return a.init === b.init | |
} | |
} | |
return false | |
} | |
},{"../vnode/is-widget.js":16}],11:[function(require,module,exports){ | |
var isVNode = require("./is-vnode") | |
var isVText = require("./is-vtext") | |
var isWidget = require("./is-widget") | |
var isThunk = require("./is-thunk") | |
module.exports = handleThunk | |
function handleThunk(a, b) { | |
var renderedA = a | |
var renderedB = b | |
if (isThunk(b)) { | |
renderedB = renderThunk(b, a) | |
} | |
if (isThunk(a)) { | |
renderedA = renderThunk(a, null) | |
} | |
return { | |
a: renderedA, | |
b: renderedB | |
} | |
} | |
function renderThunk(thunk, previous) { | |
var renderedThunk = thunk.vnode | |
if (!renderedThunk) { | |
renderedThunk = thunk.vnode = thunk.render(previous) | |
} | |
if (!(isVNode(renderedThunk) || | |
isVText(renderedThunk) || | |
isWidget(renderedThunk))) { | |
throw new Error("thunk did not return a valid node"); | |
} | |
return renderedThunk | |
} | |
},{"./is-thunk":12,"./is-vnode":14,"./is-vtext":15,"./is-widget":16}],12:[function(require,module,exports){ | |
module.exports = isThunk | |
function isThunk(t) { | |
return t && t.type === "Thunk" | |
} | |
},{}],13:[function(require,module,exports){ | |
module.exports = isHook | |
function isHook(hook) { | |
return hook && | |
(typeof hook.hook === "function" && !hook.hasOwnProperty("hook") || | |
typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook")) | |
} | |
},{}],14:[function(require,module,exports){ | |
var version = require("./version") | |
module.exports = isVirtualNode | |
function isVirtualNode(x) { | |
return x && x.type === "VirtualNode" && x.version === version | |
} | |
},{"./version":17}],15:[function(require,module,exports){ | |
var version = require("./version") | |
module.exports = isVirtualText | |
function isVirtualText(x) { | |
return x && x.type === "VirtualText" && x.version === version | |
} | |
},{"./version":17}],16:[function(require,module,exports){ | |
module.exports = isWidget | |
function isWidget(w) { | |
return w && w.type === "Widget" | |
} | |
},{}],17:[function(require,module,exports){ | |
module.exports = "2" | |
},{}],18:[function(require,module,exports){ | |
var version = require("./version") | |
var isVNode = require("./is-vnode") | |
var isWidget = require("./is-widget") | |
var isThunk = require("./is-thunk") | |
var isVHook = require("./is-vhook") | |
module.exports = VirtualNode | |
var noProperties = {} | |
var noChildren = [] | |
function VirtualNode(tagName, properties, children, key, namespace) { | |
this.tagName = tagName | |
this.properties = properties || noProperties | |
this.children = children || noChildren | |
this.key = key != null ? String(key) : undefined | |
this.namespace = (typeof namespace === "string") ? namespace : null | |
var count = (children && children.length) || 0 | |
var descendants = 0 | |
var hasWidgets = false | |
var hasThunks = false | |
var descendantHooks = false | |
var hooks | |
for (var propName in properties) { | |
if (properties.hasOwnProperty(propName)) { | |
var property = properties[propName] | |
if (isVHook(property) && property.unhook) { | |
if (!hooks) { | |
hooks = {} | |
} | |
hooks[propName] = property | |
} | |
} | |
} | |
for (var i = 0; i < count; i++) { | |
var child = children[i] | |
if (isVNode(child)) { | |
descendants += child.count || 0 | |
if (!hasWidgets && child.hasWidgets) { | |
hasWidgets = true | |
} | |
if (!hasThunks && child.hasThunks) { | |
hasThunks = true | |
} | |
if (!descendantHooks && (child.hooks || child.descendantHooks)) { | |
descendantHooks = true | |
} | |
} else if (!hasWidgets && isWidget(child)) { | |
if (typeof child.destroy === "function") { | |
hasWidgets = true | |
} | |
} else if (!hasThunks && isThunk(child)) { | |
hasThunks = true; | |
} | |
} | |
this.count = count + descendants | |
this.hasWidgets = hasWidgets | |
this.hasThunks = hasThunks | |
this.hooks = hooks | |
this.descendantHooks = descendantHooks | |
} | |
VirtualNode.prototype.version = version | |
VirtualNode.prototype.type = "VirtualNode" | |
},{"./is-thunk":12,"./is-vhook":13,"./is-vnode":14,"./is-widget":16,"./version":17}],19:[function(require,module,exports){ | |
var version = require("./version") | |
VirtualPatch.NONE = 0 | |
VirtualPatch.VTEXT = 1 | |
VirtualPatch.VNODE = 2 | |
VirtualPatch.WIDGET = 3 | |
VirtualPatch.PROPS = 4 | |
VirtualPatch.ORDER = 5 | |
VirtualPatch.INSERT = 6 | |
VirtualPatch.REMOVE = 7 | |
VirtualPatch.THUNK = 8 | |
module.exports = VirtualPatch | |
function VirtualPatch(type, vNode, patch) { | |
this.type = Number(type) | |
this.vNode = vNode | |
this.patch = patch | |
} | |
VirtualPatch.prototype.version = version | |
VirtualPatch.prototype.type = "VirtualPatch" | |
},{"./version":17}],20:[function(require,module,exports){ | |
var version = require("./version") | |
module.exports = VirtualText | |
function VirtualText(text) { | |
this.text = String(text) | |
} | |
VirtualText.prototype.version = version | |
VirtualText.prototype.type = "VirtualText" | |
},{"./version":17}],21:[function(require,module,exports){ | |
var isObject = require("is-object") | |
var isHook = require("../vnode/is-vhook") | |
module.exports = diffProps | |
function diffProps(a, b) { | |
var diff | |
for (var aKey in a) { | |
if (!(aKey in b)) { | |
diff = diff || {} | |
diff[aKey] = undefined | |
} | |
var aValue = a[aKey] | |
var bValue = b[aKey] | |
if (aValue === bValue) { | |
continue | |
} else if (isObject(aValue) && isObject(bValue)) { | |
if (getPrototype(bValue) !== getPrototype(aValue)) { | |
diff = diff || {} | |
diff[aKey] = bValue | |
} else if (isHook(bValue)) { | |
diff = diff || {} | |
diff[aKey] = bValue | |
} else { | |
var objectDiff = diffProps(aValue, bValue) | |
if (objectDiff) { | |
diff = diff || {} | |
diff[aKey] = objectDiff | |
} | |
} | |
} else { | |
diff = diff || {} | |
diff[aKey] = bValue | |
} | |
} | |
for (var bKey in b) { | |
if (!(bKey in a)) { | |
diff = diff || {} | |
diff[bKey] = b[bKey] | |
} | |
} | |
return diff | |
} | |
function getPrototype(value) { | |
if (Object.getPrototypeOf) { | |
return Object.getPrototypeOf(value) | |
} else if (value.__proto__) { | |
return value.__proto__ | |
} else if (value.constructor) { | |
return value.constructor.prototype | |
} | |
} | |
},{"../vnode/is-vhook":13,"is-object":3}],22:[function(require,module,exports){ | |
var isArray = require("x-is-array") | |
var VPatch = require("../vnode/vpatch") | |
var isVNode = require("../vnode/is-vnode") | |
var isVText = require("../vnode/is-vtext") | |
var isWidget = require("../vnode/is-widget") | |
var isThunk = require("../vnode/is-thunk") | |
var handleThunk = require("../vnode/handle-thunk") | |
var diffProps = require("./diff-props") | |
module.exports = diff | |
function diff(a, b) { | |
var patch = { a: a } | |
walk(a, b, patch, 0) | |
return patch | |
} | |
function walk(a, b, patch, index) { | |
if (a === b) { | |
return | |
} | |
var apply = patch[index] | |
var applyClear = false | |
if (isThunk(a) || isThunk(b)) { | |
thunks(a, b, patch, index) | |
} else if (b == null) { | |
// If a is a widget we will add a remove patch for it | |
// Otherwise any child widgets/hooks must be destroyed. | |
// This prevents adding two remove patches for a widget. | |
if (!isWidget(a)) { | |
clearState(a, patch, index) | |
apply = patch[index] | |
} | |
apply = appendPatch(apply, new VPatch(VPatch.REMOVE, a, b)) | |
} else if (isVNode(b)) { | |
if (isVNode(a)) { | |
if (a.tagName === b.tagName && | |
a.namespace === b.namespace && | |
a.key === b.key) { | |
var propsPatch = diffProps(a.properties, b.properties) | |
if (propsPatch) { | |
apply = appendPatch(apply, | |
new VPatch(VPatch.PROPS, a, propsPatch)) | |
} | |
apply = diffChildren(a, b, patch, apply, index) | |
} else { | |
apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b)) | |
applyClear = true | |
} | |
} else { | |
apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b)) | |
applyClear = true | |
} | |
} else if (isVText(b)) { | |
if (!isVText(a)) { | |
apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b)) | |
applyClear = true | |
} else if (a.text !== b.text) { | |
apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b)) | |
} | |
} else if (isWidget(b)) { | |
if (!isWidget(a)) { | |
applyClear = true | |
} | |
apply = appendPatch(apply, new VPatch(VPatch.WIDGET, a, b)) | |
} | |
if (apply) { | |
patch[index] = apply | |
} | |
if (applyClear) { | |
clearState(a, patch, index) | |
} | |
} | |
function diffChildren(a, b, patch, apply, index) { | |
var aChildren = a.children | |
var orderedSet = reorder(aChildren, b.children) | |
var bChildren = orderedSet.children | |
var aLen = aChildren.length | |
var bLen = bChildren.length | |
var len = aLen > bLen ? aLen : bLen | |
for (var i = 0; i < len; i++) { | |
var leftNode = aChildren[i] | |
var rightNode = bChildren[i] | |
index += 1 | |
if (!leftNode) { | |
if (rightNode) { | |
// Excess nodes in b need to be added | |
apply = appendPatch(apply, | |
new VPatch(VPatch.INSERT, null, rightNode)) | |
} | |
} else { | |
walk(leftNode, rightNode, patch, index) | |
} | |
if (isVNode(leftNode) && leftNode.count) { | |
index += leftNode.count | |
} | |
} | |
if (orderedSet.moves) { | |
// Reorder nodes last | |
apply = appendPatch(apply, new VPatch( | |
VPatch.ORDER, | |
a, | |
orderedSet.moves | |
)) | |
} | |
return apply | |
} | |
function clearState(vNode, patch, index) { | |
// TODO: Make this a single walk, not two | |
unhook(vNode, patch, index) | |
destroyWidgets(vNode, patch, index) | |
} | |
// Patch records for all destroyed widgets must be added because we need | |
// a DOM node reference for the destroy function | |
function destroyWidgets(vNode, patch, index) { | |
if (isWidget(vNode)) { | |
if (typeof vNode.destroy === "function") { | |
patch[index] = appendPatch( | |
patch[index], | |
new VPatch(VPatch.REMOVE, vNode, null) | |
) | |
} | |
} else if (isVNode(vNode) && (vNode.hasWidgets || vNode.hasThunks)) { | |
var children = vNode.children | |
var len = children.length | |
for (var i = 0; i < len; i++) { | |
var child = children[i] | |
index += 1 | |
destroyWidgets(child, patch, index) | |
if (isVNode(child) && child.count) { | |
index += child.count | |
} | |
} | |
} else if (isThunk(vNode)) { | |
thunks(vNode, null, patch, index) | |
} | |
} | |
// Create a sub-patch for thunks | |
function thunks(a, b, patch, index) { | |
var nodes = handleThunk(a, b) | |
var thunkPatch = diff(nodes.a, nodes.b) | |
if (hasPatches(thunkPatch)) { | |
patch[index] = new VPatch(VPatch.THUNK, null, thunkPatch) | |
} | |
} | |
function hasPatches(patch) { | |
for (var index in patch) { | |
if (index !== "a") { | |
return true | |
} | |
} | |
return false | |
} | |
// Execute hooks when two nodes are identical | |
function unhook(vNode, patch, index) { | |
if (isVNode(vNode)) { | |
if (vNode.hooks) { | |
patch[index] = appendPatch( | |
patch[index], | |
new VPatch( | |
VPatch.PROPS, | |
vNode, | |
undefinedKeys(vNode.hooks) | |
) | |
) | |
} | |
if (vNode.descendantHooks || vNode.hasThunks) { | |
var children = vNode.children | |
var len = children.length | |
for (var i = 0; i < len; i++) { | |
var child = children[i] | |
index += 1 | |
unhook(child, patch, index) | |
if (isVNode(child) && child.count) { | |
index += child.count | |
} | |
} | |
} | |
} else if (isThunk(vNode)) { | |
thunks(vNode, null, patch, index) | |
} | |
} | |
function undefinedKeys(obj) { | |
var result = {} | |
for (var key in obj) { | |
result[key] = undefined | |
} | |
return result | |
} | |
// List diff, naive left to right reordering | |
function reorder(aChildren, bChildren) { | |
// O(M) time, O(M) memory | |
var bChildIndex = keyIndex(bChildren) | |
var bKeys = bChildIndex.keys | |
var bFree = bChildIndex.free | |
if (bFree.length === bChildren.length) { | |
return { | |
children: bChildren, | |
moves: null | |
} | |
} | |
// O(N) time, O(N) memory | |
var aChildIndex = keyIndex(aChildren) | |
var aKeys = aChildIndex.keys | |
var aFree = aChildIndex.free | |
if (aFree.length === aChildren.length) { | |
return { | |
children: bChildren, | |
moves: null | |
} | |
} | |
// O(MAX(N, M)) memory | |
var newChildren = [] | |
var freeIndex = 0 | |
var freeCount = bFree.length | |
var deletedItems = 0 | |
// Iterate through a and match a node in b | |
// O(N) time, | |
for (var i = 0 ; i < aChildren.length; i++) { | |
var aItem = aChildren[i] | |
var itemIndex | |
if (aItem.key) { | |
if (bKeys.hasOwnProperty(aItem.key)) { | |
// Match up the old keys | |
itemIndex = bKeys[aItem.key] | |
newChildren.push(bChildren[itemIndex]) | |
} else { | |
// Remove old keyed items | |
itemIndex = i - deletedItems++ | |
newChildren.push(null) | |
} | |
} else { | |
// Match the item in a with the next free item in b | |
if (freeIndex < freeCount) { | |
itemIndex = bFree[freeIndex++] | |
newChildren.push(bChildren[itemIndex]) | |
} else { | |
// There are no free items in b to match with | |
// the free items in a, so the extra free nodes | |
// are deleted. | |
itemIndex = i - deletedItems++ | |
newChildren.push(null) | |
} | |
} | |
} | |
var lastFreeIndex = freeIndex >= bFree.length ? | |
bChildren.length : | |
bFree[freeIndex] | |
// Iterate through b and append any new keys | |
// O(M) time | |
for (var j = 0; j < bChildren.length; j++) { | |
var newItem = bChildren[j] | |
if (newItem.key) { | |
if (!aKeys.hasOwnProperty(newItem.key)) { | |
// Add any new keyed items | |
// We are adding new items to the end and then sorting them | |
// in place. In future we should insert new items in place. | |
newChildren.push(newItem) | |
} | |
} else if (j >= lastFreeIndex) { | |
// Add any leftover non-keyed items | |
newChildren.push(newItem) | |
} | |
} | |
var simulate = newChildren.slice() | |
var simulateIndex = 0 | |
var removes = [] | |
var inserts = [] | |
var simulateItem | |
for (var k = 0; k < bChildren.length;) { | |
var wantedItem = bChildren[k] | |
simulateItem = simulate[simulateIndex] | |
// remove items | |
while (simulateItem === null && simulate.length) { | |
removes.push(remove(simulate, simulateIndex, null)) | |
simulateItem = simulate[simulateIndex] | |
} | |
if (!simulateItem || simulateItem.key !== wantedItem.key) { | |
// if we need a key in this position... | |
if (wantedItem.key) { | |
if (simulateItem && simulateItem.key) { | |
// if an insert doesn't put this key in place, it needs to move | |
if (bKeys[simulateItem.key] !== k + 1) { | |
removes.push(remove(simulate, simulateIndex, simulateItem.key)) | |
simulateItem = simulate[simulateIndex] | |
// if the remove didn't put the wanted item in place, we need to insert it | |
if (!simulateItem || simulateItem.key !== wantedItem.key) { | |
inserts.push({key: wantedItem.key, to: k}) | |
} | |
// items are matching, so skip ahead | |
else { | |
simulateIndex++ | |
} | |
} | |
else { | |
inserts.push({key: wantedItem.key, to: k}) | |
} | |
} | |
else { | |
inserts.push({key: wantedItem.key, to: k}) | |
} | |
k++ | |
} | |
// a key in simulate has no matching wanted key, remove it | |
else if (simulateItem && simulateItem.key) { | |
removes.push(remove(simulate, simulateIndex, simulateItem.key)) | |
} | |
} | |
else { | |
simulateIndex++ | |
k++ | |
} | |
} | |
// remove all the remaining nodes from simulate | |
while(simulateIndex < simulate.length) { | |
simulateItem = simulate[simulateIndex] | |
removes.push(remove(simulate, simulateIndex, simulateItem && simulateItem.key)) | |
} | |
// If the only moves we have are deletes then we can just | |
// let the delete patch remove these items. | |
if (removes.length === deletedItems && !inserts.length) { | |
return { | |
children: newChildren, | |
moves: null | |
} | |
} | |
return { | |
children: newChildren, | |
moves: { | |
removes: removes, | |
inserts: inserts | |
} | |
} | |
} | |
function remove(arr, index, key) { | |
arr.splice(index, 1) | |
return { | |
from: index, | |
key: key | |
} | |
} | |
function keyIndex(children) { | |
var keys = {} | |
var free = [] | |
var length = children.length | |
for (var i = 0; i < length; i++) { | |
var child = children[i] | |
if (child.key) { | |
keys[child.key] = i | |
} else { | |
free.push(i) | |
} | |
} | |
return { | |
keys: keys, // A hash of key name to index | |
free: free, // An array of unkeyed item indices | |
} | |
} | |
function appendPatch(apply, patch) { | |
if (apply) { | |
if (isArray(apply)) { | |
apply.push(patch) | |
} else { | |
apply = [apply, patch] | |
} | |
return apply | |
} else { | |
return patch | |
} | |
} | |
},{"../vnode/handle-thunk":11,"../vnode/is-thunk":12,"../vnode/is-vnode":14,"../vnode/is-vtext":15,"../vnode/is-widget":16,"../vnode/vpatch":19,"./diff-props":21,"x-is-array":4}],23:[function(require,module,exports){ | |
var VNode = require('virtual-dom/vnode/vnode'); | |
var VText = require('virtual-dom/vnode/vtext'); | |
var diff = require('virtual-dom/vtree/diff'); | |
var patch = require('virtual-dom/vdom/patch'); | |
var createElement = require('virtual-dom/vdom/create-element'); | |
var isHook = require("virtual-dom/vnode/is-vhook"); | |
Elm.Native.VirtualDom = {}; | |
Elm.Native.VirtualDom.make = function(elm) | |
{ | |
elm.Native = elm.Native || {}; | |
elm.Native.VirtualDom = elm.Native.VirtualDom || {}; | |
if (elm.Native.VirtualDom.values) | |
{ | |
return elm.Native.VirtualDom.values; | |
} | |
var Element = Elm.Native.Graphics.Element.make(elm); | |
var Json = Elm.Native.Json.make(elm); | |
var List = Elm.Native.List.make(elm); | |
var Signal = Elm.Native.Signal.make(elm); | |
var Utils = Elm.Native.Utils.make(elm); | |
var ATTRIBUTE_KEY = 'UniqueNameThatOthersAreVeryUnlikelyToUse'; | |
// VIRTUAL DOM NODES | |
function text(string) | |
{ | |
return new VText(string); | |
} | |
function node(name) | |
{ | |
return F2(function(propertyList, contents) { | |
return makeNode(name, propertyList, contents); | |
}); | |
} | |
// BUILD VIRTUAL DOME NODES | |
function makeNode(name, propertyList, contents) | |
{ | |
var props = listToProperties(propertyList); | |
var key, namespace; | |
// support keys | |
if (props.key !== undefined) | |
{ | |
key = props.key; | |
props.key = undefined; | |
} | |
// support namespace | |
if (props.namespace !== undefined) | |
{ | |
namespace = props.namespace; | |
props.namespace = undefined; | |
} | |
// ensure that setting text of an input does not move the cursor | |
var useSoftSet = | |
(name === 'input' || name === 'textarea') | |
&& props.value !== undefined | |
&& !isHook(props.value); | |
if (useSoftSet) | |
{ | |
props.value = SoftSetHook(props.value); | |
} | |
return new VNode(name, props, List.toArray(contents), key, namespace); | |
} | |
function listToProperties(list) | |
{ | |
var object = {}; | |
while (list.ctor !== '[]') | |
{ | |
var entry = list._0; | |
if (entry.key === ATTRIBUTE_KEY) | |
{ | |
object.attributes = object.attributes || {}; | |
object.attributes[entry.value.attrKey] = entry.value.attrValue; | |
} | |
else | |
{ | |
object[entry.key] = entry.value; | |
} | |
list = list._1; | |
} | |
return object; | |
} | |
// PROPERTIES AND ATTRIBUTES | |
function property(key, value) | |
{ | |
return { | |
key: key, | |
value: value | |
}; | |
} | |
function attribute(key, value) | |
{ | |
return { | |
key: ATTRIBUTE_KEY, | |
value: { | |
attrKey: key, | |
attrValue: value | |
} | |
}; | |
} | |
// NAMESPACED ATTRIBUTES | |
function attributeNS(namespace, key, value) | |
{ | |
return { | |
key: key, | |
value: new AttributeHook(namespace, key, value) | |
}; | |
} | |
function AttributeHook(namespace, key, value) | |
{ | |
if (!(this instanceof AttributeHook)) | |
{ | |
return new AttributeHook(namespace, key, value); | |
} | |
this.namespace = namespace; | |
this.key = key; | |
this.value = value; | |
} | |
AttributeHook.prototype.hook = function (node, prop, prev) | |
{ | |
if (prev | |
&& prev.type === 'AttributeHook' | |
&& prev.value === this.value | |
&& prev.namespace === this.namespace) | |
{ | |
return; | |
} | |
node.setAttributeNS(this.namespace, prop, this.value); | |
}; | |
AttributeHook.prototype.unhook = function (node, prop, next) | |
{ | |
if (next | |
&& next.type === 'AttributeHook' | |
&& next.namespace === this.namespace) | |
{ | |
return; | |
} | |
node.removeAttributeNS(this.namespace, this.key); | |
}; | |
AttributeHook.prototype.type = 'AttributeHook'; | |
// EVENTS | |
function on(name, options, decoder, createMessage) | |
{ | |
function eventHandler(event) | |
{ | |
var value = A2(Json.runDecoderValue, decoder, event); | |
if (value.ctor === 'Ok') | |
{ | |
if (options.stopPropagation) | |
{ | |
event.stopPropagation(); | |
} | |
if (options.preventDefault) | |
{ | |
event.preventDefault(); | |
} | |
Signal.sendMessage(createMessage(value._0)); | |
} | |
} | |
return property('on' + name, eventHandler); | |
} | |
function SoftSetHook(value) | |
{ | |
if (!(this instanceof SoftSetHook)) | |
{ | |
return new SoftSetHook(value); | |
} | |
this.value = value; | |
} | |
SoftSetHook.prototype.hook = function (node, propertyName) | |
{ | |
if (node[propertyName] !== this.value) | |
{ | |
node[propertyName] = this.value; | |
} | |
}; | |
// INTEGRATION WITH ELEMENTS | |
function ElementWidget(element) | |
{ | |
this.element = element; | |
} | |
ElementWidget.prototype.type = "Widget"; | |
ElementWidget.prototype.init = function init() | |
{ | |
return Element.render(this.element); | |
}; | |
ElementWidget.prototype.update = function update(previous, node) | |
{ | |
return Element.update(node, previous.element, this.element); | |
}; | |
function fromElement(element) | |
{ | |
return new ElementWidget(element); | |
} | |
function toElement(width, height, html) | |
{ | |
return A3(Element.newElement, width, height, { | |
ctor: 'Custom', | |
type: 'evancz/elm-html', | |
render: render, | |
update: update, | |
model: html | |
}); | |
} | |
// RENDER AND UPDATE | |
function render(model) | |
{ | |
var element = Element.createNode('div'); | |
element.appendChild(createElement(model)); | |
return element; | |
} | |
function update(node, oldModel, newModel) | |
{ | |
updateAndReplace(node.firstChild, oldModel, newModel); | |
return node; | |
} | |
function updateAndReplace(node, oldModel, newModel) | |
{ | |
var patches = diff(oldModel, newModel); | |
var newNode = patch(node, patches); | |
return newNode; | |
} | |
// LAZINESS | |
function lazyRef(fn, a) | |
{ | |
function thunk() | |
{ | |
return fn(a); | |
} | |
return new Thunk(fn, [a], thunk); | |
} | |
function lazyRef2(fn, a, b) | |
{ | |
function thunk() | |
{ | |
return A2(fn, a, b); | |
} | |
return new Thunk(fn, [a,b], thunk); | |
} | |
function lazyRef3(fn, a, b, c) | |
{ | |
function thunk() | |
{ | |
return A3(fn, a, b, c); | |
} | |
return new Thunk(fn, [a,b,c], thunk); | |
} | |
function Thunk(fn, args, thunk) | |
{ | |
/* public (used by VirtualDom.js) */ | |
this.vnode = null; | |
this.key = undefined; | |
/* private */ | |
this.fn = fn; | |
this.args = args; | |
this.thunk = thunk; | |
} | |
Thunk.prototype.type = "Thunk"; | |
Thunk.prototype.render = renderThunk; | |
function shouldUpdate(current, previous) | |
{ | |
if (current.fn !== previous.fn) | |
{ | |
return true; | |
} | |
// if it's the same function, we know the number of args must match | |
var cargs = current.args; | |
var pargs = previous.args; | |
for (var i = cargs.length; i--; ) | |
{ | |
if (cargs[i] !== pargs[i]) | |
{ | |
return true; | |
} | |
} | |
return false; | |
} | |
function renderThunk(previous) | |
{ | |
if (previous == null || shouldUpdate(this, previous)) | |
{ | |
return this.thunk(); | |
} | |
else | |
{ | |
return previous.vnode; | |
} | |
} | |
return elm.Native.VirtualDom.values = Elm.Native.VirtualDom.values = { | |
node: node, | |
text: text, | |
on: F4(on), | |
property: F2(property), | |
attribute: F2(attribute), | |
attributeNS: F3(attributeNS), | |
lazy: F2(lazyRef), | |
lazy2: F3(lazyRef2), | |
lazy3: F4(lazyRef3), | |
toElement: F3(toElement), | |
fromElement: fromElement, | |
render: createElement, | |
updateAndReplace: updateAndReplace | |
}; | |
}; | |
},{"virtual-dom/vdom/create-element":6,"virtual-dom/vdom/patch":9,"virtual-dom/vnode/is-vhook":13,"virtual-dom/vnode/vnode":18,"virtual-dom/vnode/vtext":20,"virtual-dom/vtree/diff":22}]},{},[23]); | |
Elm.VirtualDom = Elm.VirtualDom || {}; | |
Elm.VirtualDom.make = function (_elm) { | |
"use strict"; | |
_elm.VirtualDom = _elm.VirtualDom || {}; | |
if (_elm.VirtualDom.values) return _elm.VirtualDom.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$Graphics$Element = Elm.Graphics.Element.make(_elm), | |
$Json$Decode = Elm.Json.Decode.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Native$VirtualDom = Elm.Native.VirtualDom.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Signal = Elm.Signal.make(_elm); | |
var _op = {}; | |
var lazy3 = $Native$VirtualDom.lazy3; | |
var lazy2 = $Native$VirtualDom.lazy2; | |
var lazy = $Native$VirtualDom.lazy; | |
var defaultOptions = {stopPropagation: false | |
,preventDefault: false}; | |
var Options = F2(function (a,b) { | |
return {stopPropagation: a,preventDefault: b}; | |
}); | |
var onWithOptions = $Native$VirtualDom.on; | |
var on = F3(function (eventName,decoder,toMessage) { | |
return A4($Native$VirtualDom.on, | |
eventName, | |
defaultOptions, | |
decoder, | |
toMessage); | |
}); | |
var attributeNS = $Native$VirtualDom.attributeNS; | |
var attribute = $Native$VirtualDom.attribute; | |
var property = $Native$VirtualDom.property; | |
var Property = {ctor: "Property"}; | |
var fromElement = $Native$VirtualDom.fromElement; | |
var toElement = $Native$VirtualDom.toElement; | |
var text = $Native$VirtualDom.text; | |
var node = $Native$VirtualDom.node; | |
var Node = {ctor: "Node"}; | |
return _elm.VirtualDom.values = {_op: _op | |
,text: text | |
,node: node | |
,toElement: toElement | |
,fromElement: fromElement | |
,property: property | |
,attribute: attribute | |
,attributeNS: attributeNS | |
,on: on | |
,onWithOptions: onWithOptions | |
,defaultOptions: defaultOptions | |
,lazy: lazy | |
,lazy2: lazy2 | |
,lazy3: lazy3 | |
,Options: Options}; | |
}; | |
Elm.Html = Elm.Html || {}; | |
Elm.Html.make = function (_elm) { | |
"use strict"; | |
_elm.Html = _elm.Html || {}; | |
if (_elm.Html.values) return _elm.Html.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$Graphics$Element = Elm.Graphics.Element.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Signal = Elm.Signal.make(_elm), | |
$VirtualDom = Elm.VirtualDom.make(_elm); | |
var _op = {}; | |
var fromElement = $VirtualDom.fromElement; | |
var toElement = $VirtualDom.toElement; | |
var text = $VirtualDom.text; | |
var node = $VirtualDom.node; | |
var body = node("body"); | |
var section = node("section"); | |
var nav = node("nav"); | |
var article = node("article"); | |
var aside = node("aside"); | |
var h1 = node("h1"); | |
var h2 = node("h2"); | |
var h3 = node("h3"); | |
var h4 = node("h4"); | |
var h5 = node("h5"); | |
var h6 = node("h6"); | |
var header = node("header"); | |
var footer = node("footer"); | |
var address = node("address"); | |
var main$ = node("main"); | |
var p = node("p"); | |
var hr = node("hr"); | |
var pre = node("pre"); | |
var blockquote = node("blockquote"); | |
var ol = node("ol"); | |
var ul = node("ul"); | |
var li = node("li"); | |
var dl = node("dl"); | |
var dt = node("dt"); | |
var dd = node("dd"); | |
var figure = node("figure"); | |
var figcaption = node("figcaption"); | |
var div = node("div"); | |
var a = node("a"); | |
var em = node("em"); | |
var strong = node("strong"); | |
var small = node("small"); | |
var s = node("s"); | |
var cite = node("cite"); | |
var q = node("q"); | |
var dfn = node("dfn"); | |
var abbr = node("abbr"); | |
var time = node("time"); | |
var code = node("code"); | |
var $var = node("var"); | |
var samp = node("samp"); | |
var kbd = node("kbd"); | |
var sub = node("sub"); | |
var sup = node("sup"); | |
var i = node("i"); | |
var b = node("b"); | |
var u = node("u"); | |
var mark = node("mark"); | |
var ruby = node("ruby"); | |
var rt = node("rt"); | |
var rp = node("rp"); | |
var bdi = node("bdi"); | |
var bdo = node("bdo"); | |
var span = node("span"); | |
var br = node("br"); | |
var wbr = node("wbr"); | |
var ins = node("ins"); | |
var del = node("del"); | |
var img = node("img"); | |
var iframe = node("iframe"); | |
var embed = node("embed"); | |
var object = node("object"); | |
var param = node("param"); | |
var video = node("video"); | |
var audio = node("audio"); | |
var source = node("source"); | |
var track = node("track"); | |
var canvas = node("canvas"); | |
var svg = node("svg"); | |
var math = node("math"); | |
var table = node("table"); | |
var caption = node("caption"); | |
var colgroup = node("colgroup"); | |
var col = node("col"); | |
var tbody = node("tbody"); | |
var thead = node("thead"); | |
var tfoot = node("tfoot"); | |
var tr = node("tr"); | |
var td = node("td"); | |
var th = node("th"); | |
var form = node("form"); | |
var fieldset = node("fieldset"); | |
var legend = node("legend"); | |
var label = node("label"); | |
var input = node("input"); | |
var button = node("button"); | |
var select = node("select"); | |
var datalist = node("datalist"); | |
var optgroup = node("optgroup"); | |
var option = node("option"); | |
var textarea = node("textarea"); | |
var keygen = node("keygen"); | |
var output = node("output"); | |
var progress = node("progress"); | |
var meter = node("meter"); | |
var details = node("details"); | |
var summary = node("summary"); | |
var menuitem = node("menuitem"); | |
var menu = node("menu"); | |
return _elm.Html.values = {_op: _op | |
,node: node | |
,text: text | |
,toElement: toElement | |
,fromElement: fromElement | |
,body: body | |
,section: section | |
,nav: nav | |
,article: article | |
,aside: aside | |
,h1: h1 | |
,h2: h2 | |
,h3: h3 | |
,h4: h4 | |
,h5: h5 | |
,h6: h6 | |
,header: header | |
,footer: footer | |
,address: address | |
,main$: main$ | |
,p: p | |
,hr: hr | |
,pre: pre | |
,blockquote: blockquote | |
,ol: ol | |
,ul: ul | |
,li: li | |
,dl: dl | |
,dt: dt | |
,dd: dd | |
,figure: figure | |
,figcaption: figcaption | |
,div: div | |
,a: a | |
,em: em | |
,strong: strong | |
,small: small | |
,s: s | |
,cite: cite | |
,q: q | |
,dfn: dfn | |
,abbr: abbr | |
,time: time | |
,code: code | |
,$var: $var | |
,samp: samp | |
,kbd: kbd | |
,sub: sub | |
,sup: sup | |
,i: i | |
,b: b | |
,u: u | |
,mark: mark | |
,ruby: ruby | |
,rt: rt | |
,rp: rp | |
,bdi: bdi | |
,bdo: bdo | |
,span: span | |
,br: br | |
,wbr: wbr | |
,ins: ins | |
,del: del | |
,img: img | |
,iframe: iframe | |
,embed: embed | |
,object: object | |
,param: param | |
,video: video | |
,audio: audio | |
,source: source | |
,track: track | |
,canvas: canvas | |
,svg: svg | |
,math: math | |
,table: table | |
,caption: caption | |
,colgroup: colgroup | |
,col: col | |
,tbody: tbody | |
,thead: thead | |
,tfoot: tfoot | |
,tr: tr | |
,td: td | |
,th: th | |
,form: form | |
,fieldset: fieldset | |
,legend: legend | |
,label: label | |
,input: input | |
,button: button | |
,select: select | |
,datalist: datalist | |
,optgroup: optgroup | |
,option: option | |
,textarea: textarea | |
,keygen: keygen | |
,output: output | |
,progress: progress | |
,meter: meter | |
,details: details | |
,summary: summary | |
,menuitem: menuitem | |
,menu: menu}; | |
}; | |
Elm.Html = Elm.Html || {}; | |
Elm.Html.Attributes = Elm.Html.Attributes || {}; | |
Elm.Html.Attributes.make = function (_elm) { | |
"use strict"; | |
_elm.Html = _elm.Html || {}; | |
_elm.Html.Attributes = _elm.Html.Attributes || {}; | |
if (_elm.Html.Attributes.values) | |
return _elm.Html.Attributes.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$Html = Elm.Html.make(_elm), | |
$Json$Encode = Elm.Json.Encode.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Signal = Elm.Signal.make(_elm), | |
$String = Elm.String.make(_elm), | |
$VirtualDom = Elm.VirtualDom.make(_elm); | |
var _op = {}; | |
var attribute = $VirtualDom.attribute; | |
var contextmenu = function (value) { | |
return A2(attribute,"contextmenu",value); | |
}; | |
var property = $VirtualDom.property; | |
var stringProperty = F2(function (name,string) { | |
return A2(property,name,$Json$Encode.string(string)); | |
}); | |
var $class = function (name) { | |
return A2(stringProperty,"className",name); | |
}; | |
var id = function (name) { | |
return A2(stringProperty,"id",name); | |
}; | |
var title = function (name) { | |
return A2(stringProperty,"title",name); | |
}; | |
var accesskey = function ($char) { | |
return A2(stringProperty, | |
"accessKey", | |
$String.fromChar($char)); | |
}; | |
var dir = function (value) { | |
return A2(stringProperty,"dir",value); | |
}; | |
var draggable = function (value) { | |
return A2(stringProperty,"draggable",value); | |
}; | |
var dropzone = function (value) { | |
return A2(stringProperty,"dropzone",value); | |
}; | |
var itemprop = function (value) { | |
return A2(stringProperty,"itemprop",value); | |
}; | |
var lang = function (value) { | |
return A2(stringProperty,"lang",value); | |
}; | |
var tabindex = function (n) { | |
return A2(stringProperty,"tabIndex",$Basics.toString(n)); | |
}; | |
var charset = function (value) { | |
return A2(stringProperty,"charset",value); | |
}; | |
var content = function (value) { | |
return A2(stringProperty,"content",value); | |
}; | |
var httpEquiv = function (value) { | |
return A2(stringProperty,"httpEquiv",value); | |
}; | |
var language = function (value) { | |
return A2(stringProperty,"language",value); | |
}; | |
var src = function (value) { | |
return A2(stringProperty,"src",value); | |
}; | |
var height = function (value) { | |
return A2(stringProperty,"height",$Basics.toString(value)); | |
}; | |
var width = function (value) { | |
return A2(stringProperty,"width",$Basics.toString(value)); | |
}; | |
var alt = function (value) { | |
return A2(stringProperty,"alt",value); | |
}; | |
var preload = function (value) { | |
return A2(stringProperty,"preload",value); | |
}; | |
var poster = function (value) { | |
return A2(stringProperty,"poster",value); | |
}; | |
var kind = function (value) { | |
return A2(stringProperty,"kind",value); | |
}; | |
var srclang = function (value) { | |
return A2(stringProperty,"srclang",value); | |
}; | |
var sandbox = function (value) { | |
return A2(stringProperty,"sandbox",value); | |
}; | |
var srcdoc = function (value) { | |
return A2(stringProperty,"srcdoc",value); | |
}; | |
var type$ = function (value) { | |
return A2(stringProperty,"type",value); | |
}; | |
var value = function (value) { | |
return A2(stringProperty,"value",value); | |
}; | |
var placeholder = function (value) { | |
return A2(stringProperty,"placeholder",value); | |
}; | |
var accept = function (value) { | |
return A2(stringProperty,"accept",value); | |
}; | |
var acceptCharset = function (value) { | |
return A2(stringProperty,"acceptCharset",value); | |
}; | |
var action = function (value) { | |
return A2(stringProperty,"action",value); | |
}; | |
var autocomplete = function (bool) { | |
return A2(stringProperty,"autocomplete",bool ? "on" : "off"); | |
}; | |
var autosave = function (value) { | |
return A2(stringProperty,"autosave",value); | |
}; | |
var enctype = function (value) { | |
return A2(stringProperty,"enctype",value); | |
}; | |
var formaction = function (value) { | |
return A2(stringProperty,"formAction",value); | |
}; | |
var list = function (value) { | |
return A2(stringProperty,"list",value); | |
}; | |
var minlength = function (n) { | |
return A2(stringProperty,"minLength",$Basics.toString(n)); | |
}; | |
var maxlength = function (n) { | |
return A2(stringProperty,"maxLength",$Basics.toString(n)); | |
}; | |
var method = function (value) { | |
return A2(stringProperty,"method",value); | |
}; | |
var name = function (value) { | |
return A2(stringProperty,"name",value); | |
}; | |
var pattern = function (value) { | |
return A2(stringProperty,"pattern",value); | |
}; | |
var size = function (n) { | |
return A2(stringProperty,"size",$Basics.toString(n)); | |
}; | |
var $for = function (value) { | |
return A2(stringProperty,"htmlFor",value); | |
}; | |
var form = function (value) { | |
return A2(stringProperty,"form",value); | |
}; | |
var max = function (value) { | |
return A2(stringProperty,"max",value); | |
}; | |
var min = function (value) { | |
return A2(stringProperty,"min",value); | |
}; | |
var step = function (n) { | |
return A2(stringProperty,"step",n); | |
}; | |
var cols = function (n) { | |
return A2(stringProperty,"cols",$Basics.toString(n)); | |
}; | |
var rows = function (n) { | |
return A2(stringProperty,"rows",$Basics.toString(n)); | |
}; | |
var wrap = function (value) { | |
return A2(stringProperty,"wrap",value); | |
}; | |
var usemap = function (value) { | |
return A2(stringProperty,"useMap",value); | |
}; | |
var shape = function (value) { | |
return A2(stringProperty,"shape",value); | |
}; | |
var coords = function (value) { | |
return A2(stringProperty,"coords",value); | |
}; | |
var challenge = function (value) { | |
return A2(stringProperty,"challenge",value); | |
}; | |
var keytype = function (value) { | |
return A2(stringProperty,"keytype",value); | |
}; | |
var align = function (value) { | |
return A2(stringProperty,"align",value); | |
}; | |
var cite = function (value) { | |
return A2(stringProperty,"cite",value); | |
}; | |
var href = function (value) { | |
return A2(stringProperty,"href",value); | |
}; | |
var target = function (value) { | |
return A2(stringProperty,"target",value); | |
}; | |
var downloadAs = function (value) { | |
return A2(stringProperty,"download",value); | |
}; | |
var hreflang = function (value) { | |
return A2(stringProperty,"hreflang",value); | |
}; | |
var media = function (value) { | |
return A2(stringProperty,"media",value); | |
}; | |
var ping = function (value) { | |
return A2(stringProperty,"ping",value); | |
}; | |
var rel = function (value) { | |
return A2(stringProperty,"rel",value); | |
}; | |
var datetime = function (value) { | |
return A2(stringProperty,"datetime",value); | |
}; | |
var pubdate = function (value) { | |
return A2(stringProperty,"pubdate",value); | |
}; | |
var start = function (n) { | |
return A2(stringProperty,"start",$Basics.toString(n)); | |
}; | |
var colspan = function (n) { | |
return A2(stringProperty,"colSpan",$Basics.toString(n)); | |
}; | |
var headers = function (value) { | |
return A2(stringProperty,"headers",value); | |
}; | |
var rowspan = function (n) { | |
return A2(stringProperty,"rowSpan",$Basics.toString(n)); | |
}; | |
var scope = function (value) { | |
return A2(stringProperty,"scope",value); | |
}; | |
var manifest = function (value) { | |
return A2(stringProperty,"manifest",value); | |
}; | |
var boolProperty = F2(function (name,bool) { | |
return A2(property,name,$Json$Encode.bool(bool)); | |
}); | |
var hidden = function (bool) { | |
return A2(boolProperty,"hidden",bool); | |
}; | |
var contenteditable = function (bool) { | |
return A2(boolProperty,"contentEditable",bool); | |
}; | |
var spellcheck = function (bool) { | |
return A2(boolProperty,"spellcheck",bool); | |
}; | |
var async = function (bool) { | |
return A2(boolProperty,"async",bool); | |
}; | |
var defer = function (bool) { | |
return A2(boolProperty,"defer",bool); | |
}; | |
var scoped = function (bool) { | |
return A2(boolProperty,"scoped",bool); | |
}; | |
var autoplay = function (bool) { | |
return A2(boolProperty,"autoplay",bool); | |
}; | |
var controls = function (bool) { | |
return A2(boolProperty,"controls",bool); | |
}; | |
var loop = function (bool) { | |
return A2(boolProperty,"loop",bool); | |
}; | |
var $default = function (bool) { | |
return A2(boolProperty,"default",bool); | |
}; | |
var seamless = function (bool) { | |
return A2(boolProperty,"seamless",bool); | |
}; | |
var checked = function (bool) { | |
return A2(boolProperty,"checked",bool); | |
}; | |
var selected = function (bool) { | |
return A2(boolProperty,"selected",bool); | |
}; | |
var autofocus = function (bool) { | |
return A2(boolProperty,"autofocus",bool); | |
}; | |
var disabled = function (bool) { | |
return A2(boolProperty,"disabled",bool); | |
}; | |
var multiple = function (bool) { | |
return A2(boolProperty,"multiple",bool); | |
}; | |
var novalidate = function (bool) { | |
return A2(boolProperty,"noValidate",bool); | |
}; | |
var readonly = function (bool) { | |
return A2(boolProperty,"readOnly",bool); | |
}; | |
var required = function (bool) { | |
return A2(boolProperty,"required",bool); | |
}; | |
var ismap = function (value) { | |
return A2(boolProperty,"isMap",value); | |
}; | |
var download = function (bool) { | |
return A2(boolProperty,"download",bool); | |
}; | |
var reversed = function (bool) { | |
return A2(boolProperty,"reversed",bool); | |
}; | |
var classList = function (list) { | |
return $class(A2($String.join, | |
" ", | |
A2($List.map,$Basics.fst,A2($List.filter,$Basics.snd,list)))); | |
}; | |
var style = function (props) { | |
return A2(property, | |
"style", | |
$Json$Encode.object(A2($List.map, | |
function (_p0) { | |
var _p1 = _p0; | |
return {ctor: "_Tuple2" | |
,_0: _p1._0 | |
,_1: $Json$Encode.string(_p1._1)}; | |
}, | |
props))); | |
}; | |
var key = function (k) { return A2(stringProperty,"key",k);}; | |
return _elm.Html.Attributes.values = {_op: _op | |
,key: key | |
,style: style | |
,$class: $class | |
,classList: classList | |
,id: id | |
,title: title | |
,hidden: hidden | |
,type$: type$ | |
,value: value | |
,checked: checked | |
,placeholder: placeholder | |
,selected: selected | |
,accept: accept | |
,acceptCharset: acceptCharset | |
,action: action | |
,autocomplete: autocomplete | |
,autofocus: autofocus | |
,autosave: autosave | |
,disabled: disabled | |
,enctype: enctype | |
,formaction: formaction | |
,list: list | |
,maxlength: maxlength | |
,minlength: minlength | |
,method: method | |
,multiple: multiple | |
,name: name | |
,novalidate: novalidate | |
,pattern: pattern | |
,readonly: readonly | |
,required: required | |
,size: size | |
,$for: $for | |
,form: form | |
,max: max | |
,min: min | |
,step: step | |
,cols: cols | |
,rows: rows | |
,wrap: wrap | |
,href: href | |
,target: target | |
,download: download | |
,downloadAs: downloadAs | |
,hreflang: hreflang | |
,media: media | |
,ping: ping | |
,rel: rel | |
,ismap: ismap | |
,usemap: usemap | |
,shape: shape | |
,coords: coords | |
,src: src | |
,height: height | |
,width: width | |
,alt: alt | |
,autoplay: autoplay | |
,controls: controls | |
,loop: loop | |
,preload: preload | |
,poster: poster | |
,$default: $default | |
,kind: kind | |
,srclang: srclang | |
,sandbox: sandbox | |
,seamless: seamless | |
,srcdoc: srcdoc | |
,reversed: reversed | |
,start: start | |
,align: align | |
,colspan: colspan | |
,rowspan: rowspan | |
,headers: headers | |
,scope: scope | |
,async: async | |
,charset: charset | |
,content: content | |
,defer: defer | |
,httpEquiv: httpEquiv | |
,language: language | |
,scoped: scoped | |
,accesskey: accesskey | |
,contenteditable: contenteditable | |
,contextmenu: contextmenu | |
,dir: dir | |
,draggable: draggable | |
,dropzone: dropzone | |
,itemprop: itemprop | |
,lang: lang | |
,spellcheck: spellcheck | |
,tabindex: tabindex | |
,challenge: challenge | |
,keytype: keytype | |
,cite: cite | |
,datetime: datetime | |
,pubdate: pubdate | |
,manifest: manifest | |
,property: property | |
,attribute: attribute}; | |
}; | |
Elm.Svg = Elm.Svg || {}; | |
Elm.Svg.make = function (_elm) { | |
"use strict"; | |
_elm.Svg = _elm.Svg || {}; | |
if (_elm.Svg.values) return _elm.Svg.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$Html = Elm.Html.make(_elm), | |
$Json$Encode = Elm.Json.Encode.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Signal = Elm.Signal.make(_elm), | |
$VirtualDom = Elm.VirtualDom.make(_elm); | |
var _op = {}; | |
var text = $VirtualDom.text; | |
var svgNamespace = A2($VirtualDom.property, | |
"namespace", | |
$Json$Encode.string("http://www.w3.org/2000/svg")); | |
var node = F3(function (name,attributes,children) { | |
return A3($VirtualDom.node, | |
name, | |
A2($List._op["::"],svgNamespace,attributes), | |
children); | |
}); | |
var svg = node("svg"); | |
var foreignObject = node("foreignObject"); | |
var animate = node("animate"); | |
var animateColor = node("animateColor"); | |
var animateMotion = node("animateMotion"); | |
var animateTransform = node("animateTransform"); | |
var mpath = node("mpath"); | |
var set = node("set"); | |
var a = node("a"); | |
var defs = node("defs"); | |
var g = node("g"); | |
var marker = node("marker"); | |
var mask = node("mask"); | |
var missingGlyph = node("missingGlyph"); | |
var pattern = node("pattern"); | |
var $switch = node("switch"); | |
var symbol = node("symbol"); | |
var desc = node("desc"); | |
var metadata = node("metadata"); | |
var title = node("title"); | |
var feBlend = node("feBlend"); | |
var feColorMatrix = node("feColorMatrix"); | |
var feComponentTransfer = node("feComponentTransfer"); | |
var feComposite = node("feComposite"); | |
var feConvolveMatrix = node("feConvolveMatrix"); | |
var feDiffuseLighting = node("feDiffuseLighting"); | |
var feDisplacementMap = node("feDisplacementMap"); | |
var feFlood = node("feFlood"); | |
var feFuncA = node("feFuncA"); | |
var feFuncB = node("feFuncB"); | |
var feFuncG = node("feFuncG"); | |
var feFuncR = node("feFuncR"); | |
var feGaussianBlur = node("feGaussianBlur"); | |
var feImage = node("feImage"); | |
var feMerge = node("feMerge"); | |
var feMergeNode = node("feMergeNode"); | |
var feMorphology = node("feMorphology"); | |
var feOffset = node("feOffset"); | |
var feSpecularLighting = node("feSpecularLighting"); | |
var feTile = node("feTile"); | |
var feTurbulence = node("feTurbulence"); | |
var font = node("font"); | |
var fontFace = node("fontFace"); | |
var fontFaceFormat = node("fontFaceFormat"); | |
var fontFaceName = node("fontFaceName"); | |
var fontFaceSrc = node("fontFaceSrc"); | |
var fontFaceUri = node("fontFaceUri"); | |
var hkern = node("hkern"); | |
var vkern = node("vkern"); | |
var linearGradient = node("linearGradient"); | |
var radialGradient = node("radialGradient"); | |
var stop = node("stop"); | |
var circle = node("circle"); | |
var ellipse = node("ellipse"); | |
var image = node("image"); | |
var line = node("line"); | |
var path = node("path"); | |
var polygon = node("polygon"); | |
var polyline = node("polyline"); | |
var rect = node("rect"); | |
var use = node("use"); | |
var feDistantLight = node("feDistantLight"); | |
var fePointLight = node("fePointLight"); | |
var feSpotLight = node("feSpotLight"); | |
var altGlyph = node("altGlyph"); | |
var altGlyphDef = node("altGlyphDef"); | |
var altGlyphItem = node("altGlyphItem"); | |
var glyph = node("glyph"); | |
var glyphRef = node("glyphRef"); | |
var textPath = node("textPath"); | |
var text$ = node("text"); | |
var tref = node("tref"); | |
var tspan = node("tspan"); | |
var clipPath = node("clipPath"); | |
var colorProfile = node("colorProfile"); | |
var cursor = node("cursor"); | |
var filter = node("filter"); | |
var script = node("script"); | |
var style = node("style"); | |
var view = node("view"); | |
return _elm.Svg.values = {_op: _op | |
,text: text | |
,node: node | |
,svg: svg | |
,foreignObject: foreignObject | |
,circle: circle | |
,ellipse: ellipse | |
,image: image | |
,line: line | |
,path: path | |
,polygon: polygon | |
,polyline: polyline | |
,rect: rect | |
,use: use | |
,animate: animate | |
,animateColor: animateColor | |
,animateMotion: animateMotion | |
,animateTransform: animateTransform | |
,mpath: mpath | |
,set: set | |
,desc: desc | |
,metadata: metadata | |
,title: title | |
,a: a | |
,defs: defs | |
,g: g | |
,marker: marker | |
,mask: mask | |
,missingGlyph: missingGlyph | |
,pattern: pattern | |
,$switch: $switch | |
,symbol: symbol | |
,altGlyph: altGlyph | |
,altGlyphDef: altGlyphDef | |
,altGlyphItem: altGlyphItem | |
,glyph: glyph | |
,glyphRef: glyphRef | |
,textPath: textPath | |
,text$: text$ | |
,tref: tref | |
,tspan: tspan | |
,font: font | |
,fontFace: fontFace | |
,fontFaceFormat: fontFaceFormat | |
,fontFaceName: fontFaceName | |
,fontFaceSrc: fontFaceSrc | |
,fontFaceUri: fontFaceUri | |
,hkern: hkern | |
,vkern: vkern | |
,linearGradient: linearGradient | |
,radialGradient: radialGradient | |
,stop: stop | |
,feBlend: feBlend | |
,feColorMatrix: feColorMatrix | |
,feComponentTransfer: feComponentTransfer | |
,feComposite: feComposite | |
,feConvolveMatrix: feConvolveMatrix | |
,feDiffuseLighting: feDiffuseLighting | |
,feDisplacementMap: feDisplacementMap | |
,feFlood: feFlood | |
,feFuncA: feFuncA | |
,feFuncB: feFuncB | |
,feFuncG: feFuncG | |
,feFuncR: feFuncR | |
,feGaussianBlur: feGaussianBlur | |
,feImage: feImage | |
,feMerge: feMerge | |
,feMergeNode: feMergeNode | |
,feMorphology: feMorphology | |
,feOffset: feOffset | |
,feSpecularLighting: feSpecularLighting | |
,feTile: feTile | |
,feTurbulence: feTurbulence | |
,feDistantLight: feDistantLight | |
,fePointLight: fePointLight | |
,feSpotLight: feSpotLight | |
,clipPath: clipPath | |
,colorProfile: colorProfile | |
,cursor: cursor | |
,filter: filter | |
,script: script | |
,style: style | |
,view: view}; | |
}; | |
Elm.Svg = Elm.Svg || {}; | |
Elm.Svg.Attributes = Elm.Svg.Attributes || {}; | |
Elm.Svg.Attributes.make = function (_elm) { | |
"use strict"; | |
_elm.Svg = _elm.Svg || {}; | |
_elm.Svg.Attributes = _elm.Svg.Attributes || {}; | |
if (_elm.Svg.Attributes.values) | |
return _elm.Svg.Attributes.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Signal = Elm.Signal.make(_elm), | |
$Svg = Elm.Svg.make(_elm), | |
$VirtualDom = Elm.VirtualDom.make(_elm); | |
var _op = {}; | |
var writingMode = $VirtualDom.attribute("writing-mode"); | |
var wordSpacing = $VirtualDom.attribute("word-spacing"); | |
var visibility = $VirtualDom.attribute("visibility"); | |
var unicodeBidi = $VirtualDom.attribute("unicode-bidi"); | |
var textRendering = $VirtualDom.attribute("text-rendering"); | |
var textDecoration = $VirtualDom.attribute("text-decoration"); | |
var textAnchor = $VirtualDom.attribute("text-anchor"); | |
var stroke = $VirtualDom.attribute("stroke"); | |
var strokeWidth = $VirtualDom.attribute("stroke-width"); | |
var strokeOpacity = $VirtualDom.attribute("stroke-opacity"); | |
var strokeMiterlimit = $VirtualDom.attribute("stroke-miterlimit"); | |
var strokeLinejoin = $VirtualDom.attribute("stroke-linejoin"); | |
var strokeLinecap = $VirtualDom.attribute("stroke-linecap"); | |
var strokeDashoffset = $VirtualDom.attribute("stroke-dashoffset"); | |
var strokeDasharray = $VirtualDom.attribute("stroke-dasharray"); | |
var stopOpacity = $VirtualDom.attribute("stop-opacity"); | |
var stopColor = $VirtualDom.attribute("stop-color"); | |
var shapeRendering = $VirtualDom.attribute("shape-rendering"); | |
var pointerEvents = $VirtualDom.attribute("pointer-events"); | |
var overflow = $VirtualDom.attribute("overflow"); | |
var opacity = $VirtualDom.attribute("opacity"); | |
var mask = $VirtualDom.attribute("mask"); | |
var markerStart = $VirtualDom.attribute("marker-start"); | |
var markerMid = $VirtualDom.attribute("marker-mid"); | |
var markerEnd = $VirtualDom.attribute("marker-end"); | |
var lightingColor = $VirtualDom.attribute("lighting-color"); | |
var letterSpacing = $VirtualDom.attribute("letter-spacing"); | |
var kerning = $VirtualDom.attribute("kerning"); | |
var imageRendering = $VirtualDom.attribute("image-rendering"); | |
var glyphOrientationVertical = $VirtualDom.attribute("glyph-orientation-vertical"); | |
var glyphOrientationHorizontal = $VirtualDom.attribute("glyph-orientation-horizontal"); | |
var fontWeight = $VirtualDom.attribute("font-weight"); | |
var fontVariant = $VirtualDom.attribute("font-variant"); | |
var fontStyle = $VirtualDom.attribute("font-style"); | |
var fontStretch = $VirtualDom.attribute("font-stretch"); | |
var fontSize = $VirtualDom.attribute("font-size"); | |
var fontSizeAdjust = $VirtualDom.attribute("font-size-adjust"); | |
var fontFamily = $VirtualDom.attribute("font-family"); | |
var floodOpacity = $VirtualDom.attribute("flood-opacity"); | |
var floodColor = $VirtualDom.attribute("flood-color"); | |
var filter = $VirtualDom.attribute("filter"); | |
var fill = $VirtualDom.attribute("fill"); | |
var fillRule = $VirtualDom.attribute("fill-rule"); | |
var fillOpacity = $VirtualDom.attribute("fill-opacity"); | |
var enableBackground = $VirtualDom.attribute("enable-background"); | |
var dominantBaseline = $VirtualDom.attribute("dominant-baseline"); | |
var display = $VirtualDom.attribute("display"); | |
var direction = $VirtualDom.attribute("direction"); | |
var cursor = $VirtualDom.attribute("cursor"); | |
var color = $VirtualDom.attribute("color"); | |
var colorRendering = $VirtualDom.attribute("color-rendering"); | |
var colorProfile = $VirtualDom.attribute("color-profile"); | |
var colorInterpolation = $VirtualDom.attribute("color-interpolation"); | |
var colorInterpolationFilters = $VirtualDom.attribute("color-interpolation-filters"); | |
var clip = $VirtualDom.attribute("clip"); | |
var clipRule = $VirtualDom.attribute("clip-rule"); | |
var clipPath = $VirtualDom.attribute("clip-path"); | |
var baselineShift = $VirtualDom.attribute("baseline-shift"); | |
var alignmentBaseline = $VirtualDom.attribute("alignment-baseline"); | |
var zoomAndPan = $VirtualDom.attribute("zoomAndPan"); | |
var z = $VirtualDom.attribute("z"); | |
var yChannelSelector = $VirtualDom.attribute("yChannelSelector"); | |
var y2 = $VirtualDom.attribute("y2"); | |
var y1 = $VirtualDom.attribute("y1"); | |
var y = $VirtualDom.attribute("y"); | |
var xmlSpace = A2($VirtualDom.attributeNS, | |
"http://www.w3.org/XML/1998/namespace", | |
"xml:space"); | |
var xmlLang = A2($VirtualDom.attributeNS, | |
"http://www.w3.org/XML/1998/namespace", | |
"xml:lang"); | |
var xmlBase = A2($VirtualDom.attributeNS, | |
"http://www.w3.org/XML/1998/namespace", | |
"xml:base"); | |
var xlinkType = A2($VirtualDom.attributeNS, | |
"http://www.w3.org/1999/xlink", | |
"xlink:type"); | |
var xlinkTitle = A2($VirtualDom.attributeNS, | |
"http://www.w3.org/1999/xlink", | |
"xlink:title"); | |
var xlinkShow = A2($VirtualDom.attributeNS, | |
"http://www.w3.org/1999/xlink", | |
"xlink:show"); | |
var xlinkRole = A2($VirtualDom.attributeNS, | |
"http://www.w3.org/1999/xlink", | |
"xlink:role"); | |
var xlinkHref = A2($VirtualDom.attributeNS, | |
"http://www.w3.org/1999/xlink", | |
"xlink:href"); | |
var xlinkArcrole = A2($VirtualDom.attributeNS, | |
"http://www.w3.org/1999/xlink", | |
"xlink:arcrole"); | |
var xlinkActuate = A2($VirtualDom.attributeNS, | |
"http://www.w3.org/1999/xlink", | |
"xlink:actuate"); | |
var xChannelSelector = $VirtualDom.attribute("xChannelSelector"); | |
var x2 = $VirtualDom.attribute("x2"); | |
var x1 = $VirtualDom.attribute("x1"); | |
var xHeight = $VirtualDom.attribute("x-height"); | |
var x = $VirtualDom.attribute("x"); | |
var widths = $VirtualDom.attribute("widths"); | |
var width = $VirtualDom.attribute("width"); | |
var viewTarget = $VirtualDom.attribute("viewTarget"); | |
var viewBox = $VirtualDom.attribute("viewBox"); | |
var vertOriginY = $VirtualDom.attribute("vert-origin-y"); | |
var vertOriginX = $VirtualDom.attribute("vert-origin-x"); | |
var vertAdvY = $VirtualDom.attribute("vert-adv-y"); | |
var version = $VirtualDom.attribute("version"); | |
var values = $VirtualDom.attribute("values"); | |
var vMathematical = $VirtualDom.attribute("v-mathematical"); | |
var vIdeographic = $VirtualDom.attribute("v-ideographic"); | |
var vHanging = $VirtualDom.attribute("v-hanging"); | |
var vAlphabetic = $VirtualDom.attribute("v-alphabetic"); | |
var unitsPerEm = $VirtualDom.attribute("units-per-em"); | |
var unicodeRange = $VirtualDom.attribute("unicode-range"); | |
var unicode = $VirtualDom.attribute("unicode"); | |
var underlineThickness = $VirtualDom.attribute("underline-thickness"); | |
var underlinePosition = $VirtualDom.attribute("underline-position"); | |
var u2 = $VirtualDom.attribute("u2"); | |
var u1 = $VirtualDom.attribute("u1"); | |
var type$ = $VirtualDom.attribute("type"); | |
var transform = $VirtualDom.attribute("transform"); | |
var to = $VirtualDom.attribute("to"); | |
var title = $VirtualDom.attribute("title"); | |
var textLength = $VirtualDom.attribute("textLength"); | |
var targetY = $VirtualDom.attribute("targetY"); | |
var targetX = $VirtualDom.attribute("targetX"); | |
var target = $VirtualDom.attribute("target"); | |
var tableValues = $VirtualDom.attribute("tableValues"); | |
var systemLanguage = $VirtualDom.attribute("systemLanguage"); | |
var surfaceScale = $VirtualDom.attribute("surfaceScale"); | |
var style = $VirtualDom.attribute("style"); | |
var string = $VirtualDom.attribute("string"); | |
var strikethroughThickness = $VirtualDom.attribute("strikethrough-thickness"); | |
var strikethroughPosition = $VirtualDom.attribute("strikethrough-position"); | |
var stitchTiles = $VirtualDom.attribute("stitchTiles"); | |
var stemv = $VirtualDom.attribute("stemv"); | |
var stemh = $VirtualDom.attribute("stemh"); | |
var stdDeviation = $VirtualDom.attribute("stdDeviation"); | |
var startOffset = $VirtualDom.attribute("startOffset"); | |
var spreadMethod = $VirtualDom.attribute("spreadMethod"); | |
var speed = $VirtualDom.attribute("speed"); | |
var specularExponent = $VirtualDom.attribute("specularExponent"); | |
var specularConstant = $VirtualDom.attribute("specularConstant"); | |
var spacing = $VirtualDom.attribute("spacing"); | |
var slope = $VirtualDom.attribute("slope"); | |
var seed = $VirtualDom.attribute("seed"); | |
var scale = $VirtualDom.attribute("scale"); | |
var ry = $VirtualDom.attribute("ry"); | |
var rx = $VirtualDom.attribute("rx"); | |
var rotate = $VirtualDom.attribute("rotate"); | |
var result = $VirtualDom.attribute("result"); | |
var restart = $VirtualDom.attribute("restart"); | |
var requiredFeatures = $VirtualDom.attribute("requiredFeatures"); | |
var requiredExtensions = $VirtualDom.attribute("requiredExtensions"); | |
var repeatDur = $VirtualDom.attribute("repeatDur"); | |
var repeatCount = $VirtualDom.attribute("repeatCount"); | |
var renderingIntent = $VirtualDom.attribute("rendering-intent"); | |
var refY = $VirtualDom.attribute("refY"); | |
var refX = $VirtualDom.attribute("refX"); | |
var radius = $VirtualDom.attribute("radius"); | |
var r = $VirtualDom.attribute("r"); | |
var primitiveUnits = $VirtualDom.attribute("primitiveUnits"); | |
var preserveAspectRatio = $VirtualDom.attribute("preserveAspectRatio"); | |
var preserveAlpha = $VirtualDom.attribute("preserveAlpha"); | |
var pointsAtZ = $VirtualDom.attribute("pointsAtZ"); | |
var pointsAtY = $VirtualDom.attribute("pointsAtY"); | |
var pointsAtX = $VirtualDom.attribute("pointsAtX"); | |
var points = $VirtualDom.attribute("points"); | |
var pointOrder = $VirtualDom.attribute("point-order"); | |
var patternUnits = $VirtualDom.attribute("patternUnits"); | |
var patternTransform = $VirtualDom.attribute("patternTransform"); | |
var patternContentUnits = $VirtualDom.attribute("patternContentUnits"); | |
var pathLength = $VirtualDom.attribute("pathLength"); | |
var path = $VirtualDom.attribute("path"); | |
var panose1 = $VirtualDom.attribute("panose-1"); | |
var overlineThickness = $VirtualDom.attribute("overline-thickness"); | |
var overlinePosition = $VirtualDom.attribute("overline-position"); | |
var origin = $VirtualDom.attribute("origin"); | |
var orientation = $VirtualDom.attribute("orientation"); | |
var orient = $VirtualDom.attribute("orient"); | |
var order = $VirtualDom.attribute("order"); | |
var operator = $VirtualDom.attribute("operator"); | |
var offset = $VirtualDom.attribute("offset"); | |
var numOctaves = $VirtualDom.attribute("numOctaves"); | |
var name = $VirtualDom.attribute("name"); | |
var mode = $VirtualDom.attribute("mode"); | |
var min = $VirtualDom.attribute("min"); | |
var method = $VirtualDom.attribute("method"); | |
var media = $VirtualDom.attribute("media"); | |
var max = $VirtualDom.attribute("max"); | |
var mathematical = $VirtualDom.attribute("mathematical"); | |
var maskUnits = $VirtualDom.attribute("maskUnits"); | |
var maskContentUnits = $VirtualDom.attribute("maskContentUnits"); | |
var markerWidth = $VirtualDom.attribute("markerWidth"); | |
var markerUnits = $VirtualDom.attribute("markerUnits"); | |
var markerHeight = $VirtualDom.attribute("markerHeight"); | |
var local = $VirtualDom.attribute("local"); | |
var limitingConeAngle = $VirtualDom.attribute("limitingConeAngle"); | |
var lengthAdjust = $VirtualDom.attribute("lengthAdjust"); | |
var lang = $VirtualDom.attribute("lang"); | |
var keyTimes = $VirtualDom.attribute("keyTimes"); | |
var keySplines = $VirtualDom.attribute("keySplines"); | |
var keyPoints = $VirtualDom.attribute("keyPoints"); | |
var kernelUnitLength = $VirtualDom.attribute("kernelUnitLength"); | |
var kernelMatrix = $VirtualDom.attribute("kernelMatrix"); | |
var k4 = $VirtualDom.attribute("k4"); | |
var k3 = $VirtualDom.attribute("k3"); | |
var k2 = $VirtualDom.attribute("k2"); | |
var k1 = $VirtualDom.attribute("k1"); | |
var k = $VirtualDom.attribute("k"); | |
var intercept = $VirtualDom.attribute("intercept"); | |
var in2 = $VirtualDom.attribute("in2"); | |
var in$ = $VirtualDom.attribute("in"); | |
var ideographic = $VirtualDom.attribute("ideographic"); | |
var id = $VirtualDom.attribute("id"); | |
var horizOriginY = $VirtualDom.attribute("horiz-origin-y"); | |
var horizOriginX = $VirtualDom.attribute("horiz-origin-x"); | |
var horizAdvX = $VirtualDom.attribute("horiz-adv-x"); | |
var height = $VirtualDom.attribute("height"); | |
var hanging = $VirtualDom.attribute("hanging"); | |
var gradientUnits = $VirtualDom.attribute("gradientUnits"); | |
var gradientTransform = $VirtualDom.attribute("gradientTransform"); | |
var glyphRef = $VirtualDom.attribute("glyphRef"); | |
var glyphName = $VirtualDom.attribute("glyph-name"); | |
var g2 = $VirtualDom.attribute("g2"); | |
var g1 = $VirtualDom.attribute("g1"); | |
var fy = $VirtualDom.attribute("fy"); | |
var fx = $VirtualDom.attribute("fx"); | |
var from = $VirtualDom.attribute("from"); | |
var format = $VirtualDom.attribute("format"); | |
var filterUnits = $VirtualDom.attribute("filterUnits"); | |
var filterRes = $VirtualDom.attribute("filterRes"); | |
var externalResourcesRequired = $VirtualDom.attribute("externalResourcesRequired"); | |
var exponent = $VirtualDom.attribute("exponent"); | |
var end = $VirtualDom.attribute("end"); | |
var elevation = $VirtualDom.attribute("elevation"); | |
var edgeMode = $VirtualDom.attribute("edgeMode"); | |
var dy = $VirtualDom.attribute("dy"); | |
var dx = $VirtualDom.attribute("dx"); | |
var dur = $VirtualDom.attribute("dur"); | |
var divisor = $VirtualDom.attribute("divisor"); | |
var diffuseConstant = $VirtualDom.attribute("diffuseConstant"); | |
var descent = $VirtualDom.attribute("descent"); | |
var decelerate = $VirtualDom.attribute("decelerate"); | |
var d = $VirtualDom.attribute("d"); | |
var cy = $VirtualDom.attribute("cy"); | |
var cx = $VirtualDom.attribute("cx"); | |
var contentStyleType = $VirtualDom.attribute("contentStyleType"); | |
var contentScriptType = $VirtualDom.attribute("contentScriptType"); | |
var clipPathUnits = $VirtualDom.attribute("clipPathUnits"); | |
var $class = $VirtualDom.attribute("class"); | |
var capHeight = $VirtualDom.attribute("cap-height"); | |
var calcMode = $VirtualDom.attribute("calcMode"); | |
var by = $VirtualDom.attribute("by"); | |
var bias = $VirtualDom.attribute("bias"); | |
var begin = $VirtualDom.attribute("begin"); | |
var bbox = $VirtualDom.attribute("bbox"); | |
var baseProfile = $VirtualDom.attribute("baseProfile"); | |
var baseFrequency = $VirtualDom.attribute("baseFrequency"); | |
var azimuth = $VirtualDom.attribute("azimuth"); | |
var autoReverse = $VirtualDom.attribute("autoReverse"); | |
var attributeType = $VirtualDom.attribute("attributeType"); | |
var attributeName = $VirtualDom.attribute("attributeName"); | |
var ascent = $VirtualDom.attribute("ascent"); | |
var arabicForm = $VirtualDom.attribute("arabic-form"); | |
var amplitude = $VirtualDom.attribute("amplitude"); | |
var allowReorder = $VirtualDom.attribute("allowReorder"); | |
var alphabetic = $VirtualDom.attribute("alphabetic"); | |
var additive = $VirtualDom.attribute("additive"); | |
var accumulate = $VirtualDom.attribute("accumulate"); | |
var accelerate = $VirtualDom.attribute("accelerate"); | |
var accentHeight = $VirtualDom.attribute("accent-height"); | |
return _elm.Svg.Attributes.values = {_op: _op | |
,accentHeight: accentHeight | |
,accelerate: accelerate | |
,accumulate: accumulate | |
,additive: additive | |
,alphabetic: alphabetic | |
,allowReorder: allowReorder | |
,amplitude: amplitude | |
,arabicForm: arabicForm | |
,ascent: ascent | |
,attributeName: attributeName | |
,attributeType: attributeType | |
,autoReverse: autoReverse | |
,azimuth: azimuth | |
,baseFrequency: baseFrequency | |
,baseProfile: baseProfile | |
,bbox: bbox | |
,begin: begin | |
,bias: bias | |
,by: by | |
,calcMode: calcMode | |
,capHeight: capHeight | |
,$class: $class | |
,clipPathUnits: clipPathUnits | |
,contentScriptType: contentScriptType | |
,contentStyleType: contentStyleType | |
,cx: cx | |
,cy: cy | |
,d: d | |
,decelerate: decelerate | |
,descent: descent | |
,diffuseConstant: diffuseConstant | |
,divisor: divisor | |
,dur: dur | |
,dx: dx | |
,dy: dy | |
,edgeMode: edgeMode | |
,elevation: elevation | |
,end: end | |
,exponent: exponent | |
,externalResourcesRequired: externalResourcesRequired | |
,filterRes: filterRes | |
,filterUnits: filterUnits | |
,format: format | |
,from: from | |
,fx: fx | |
,fy: fy | |
,g1: g1 | |
,g2: g2 | |
,glyphName: glyphName | |
,glyphRef: glyphRef | |
,gradientTransform: gradientTransform | |
,gradientUnits: gradientUnits | |
,hanging: hanging | |
,height: height | |
,horizAdvX: horizAdvX | |
,horizOriginX: horizOriginX | |
,horizOriginY: horizOriginY | |
,id: id | |
,ideographic: ideographic | |
,in$: in$ | |
,in2: in2 | |
,intercept: intercept | |
,k: k | |
,k1: k1 | |
,k2: k2 | |
,k3: k3 | |
,k4: k4 | |
,kernelMatrix: kernelMatrix | |
,kernelUnitLength: kernelUnitLength | |
,keyPoints: keyPoints | |
,keySplines: keySplines | |
,keyTimes: keyTimes | |
,lang: lang | |
,lengthAdjust: lengthAdjust | |
,limitingConeAngle: limitingConeAngle | |
,local: local | |
,markerHeight: markerHeight | |
,markerUnits: markerUnits | |
,markerWidth: markerWidth | |
,maskContentUnits: maskContentUnits | |
,maskUnits: maskUnits | |
,mathematical: mathematical | |
,max: max | |
,media: media | |
,method: method | |
,min: min | |
,mode: mode | |
,name: name | |
,numOctaves: numOctaves | |
,offset: offset | |
,operator: operator | |
,order: order | |
,orient: orient | |
,orientation: orientation | |
,origin: origin | |
,overlinePosition: overlinePosition | |
,overlineThickness: overlineThickness | |
,panose1: panose1 | |
,path: path | |
,pathLength: pathLength | |
,patternContentUnits: patternContentUnits | |
,patternTransform: patternTransform | |
,patternUnits: patternUnits | |
,pointOrder: pointOrder | |
,points: points | |
,pointsAtX: pointsAtX | |
,pointsAtY: pointsAtY | |
,pointsAtZ: pointsAtZ | |
,preserveAlpha: preserveAlpha | |
,preserveAspectRatio: preserveAspectRatio | |
,primitiveUnits: primitiveUnits | |
,r: r | |
,radius: radius | |
,refX: refX | |
,refY: refY | |
,renderingIntent: renderingIntent | |
,repeatCount: repeatCount | |
,repeatDur: repeatDur | |
,requiredExtensions: requiredExtensions | |
,requiredFeatures: requiredFeatures | |
,restart: restart | |
,result: result | |
,rotate: rotate | |
,rx: rx | |
,ry: ry | |
,scale: scale | |
,seed: seed | |
,slope: slope | |
,spacing: spacing | |
,specularConstant: specularConstant | |
,specularExponent: specularExponent | |
,speed: speed | |
,spreadMethod: spreadMethod | |
,startOffset: startOffset | |
,stdDeviation: stdDeviation | |
,stemh: stemh | |
,stemv: stemv | |
,stitchTiles: stitchTiles | |
,strikethroughPosition: strikethroughPosition | |
,strikethroughThickness: strikethroughThickness | |
,string: string | |
,style: style | |
,surfaceScale: surfaceScale | |
,systemLanguage: systemLanguage | |
,tableValues: tableValues | |
,target: target | |
,targetX: targetX | |
,targetY: targetY | |
,textLength: textLength | |
,title: title | |
,to: to | |
,transform: transform | |
,type$: type$ | |
,u1: u1 | |
,u2: u2 | |
,underlinePosition: underlinePosition | |
,underlineThickness: underlineThickness | |
,unicode: unicode | |
,unicodeRange: unicodeRange | |
,unitsPerEm: unitsPerEm | |
,vAlphabetic: vAlphabetic | |
,vHanging: vHanging | |
,vIdeographic: vIdeographic | |
,vMathematical: vMathematical | |
,values: values | |
,version: version | |
,vertAdvY: vertAdvY | |
,vertOriginX: vertOriginX | |
,vertOriginY: vertOriginY | |
,viewBox: viewBox | |
,viewTarget: viewTarget | |
,width: width | |
,widths: widths | |
,x: x | |
,xHeight: xHeight | |
,x1: x1 | |
,x2: x2 | |
,xChannelSelector: xChannelSelector | |
,xlinkActuate: xlinkActuate | |
,xlinkArcrole: xlinkArcrole | |
,xlinkHref: xlinkHref | |
,xlinkRole: xlinkRole | |
,xlinkShow: xlinkShow | |
,xlinkTitle: xlinkTitle | |
,xlinkType: xlinkType | |
,xmlBase: xmlBase | |
,xmlLang: xmlLang | |
,xmlSpace: xmlSpace | |
,y: y | |
,y1: y1 | |
,y2: y2 | |
,yChannelSelector: yChannelSelector | |
,z: z | |
,zoomAndPan: zoomAndPan | |
,alignmentBaseline: alignmentBaseline | |
,baselineShift: baselineShift | |
,clipPath: clipPath | |
,clipRule: clipRule | |
,clip: clip | |
,colorInterpolationFilters: colorInterpolationFilters | |
,colorInterpolation: colorInterpolation | |
,colorProfile: colorProfile | |
,colorRendering: colorRendering | |
,color: color | |
,cursor: cursor | |
,direction: direction | |
,display: display | |
,dominantBaseline: dominantBaseline | |
,enableBackground: enableBackground | |
,fillOpacity: fillOpacity | |
,fillRule: fillRule | |
,fill: fill | |
,filter: filter | |
,floodColor: floodColor | |
,floodOpacity: floodOpacity | |
,fontFamily: fontFamily | |
,fontSizeAdjust: fontSizeAdjust | |
,fontSize: fontSize | |
,fontStretch: fontStretch | |
,fontStyle: fontStyle | |
,fontVariant: fontVariant | |
,fontWeight: fontWeight | |
,glyphOrientationHorizontal: glyphOrientationHorizontal | |
,glyphOrientationVertical: glyphOrientationVertical | |
,imageRendering: imageRendering | |
,kerning: kerning | |
,letterSpacing: letterSpacing | |
,lightingColor: lightingColor | |
,markerEnd: markerEnd | |
,markerMid: markerMid | |
,markerStart: markerStart | |
,mask: mask | |
,opacity: opacity | |
,overflow: overflow | |
,pointerEvents: pointerEvents | |
,shapeRendering: shapeRendering | |
,stopColor: stopColor | |
,stopOpacity: stopOpacity | |
,strokeDasharray: strokeDasharray | |
,strokeDashoffset: strokeDashoffset | |
,strokeLinecap: strokeLinecap | |
,strokeLinejoin: strokeLinejoin | |
,strokeMiterlimit: strokeMiterlimit | |
,strokeOpacity: strokeOpacity | |
,strokeWidth: strokeWidth | |
,stroke: stroke | |
,textAnchor: textAnchor | |
,textDecoration: textDecoration | |
,textRendering: textRendering | |
,unicodeBidi: unicodeBidi | |
,visibility: visibility | |
,wordSpacing: wordSpacing | |
,writingMode: writingMode}; | |
}; | |
Elm.StartApp = Elm.StartApp || {}; | |
Elm.StartApp.make = function (_elm) { | |
"use strict"; | |
_elm.StartApp = _elm.StartApp || {}; | |
if (_elm.StartApp.values) return _elm.StartApp.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$Effects = Elm.Effects.make(_elm), | |
$Html = Elm.Html.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Signal = Elm.Signal.make(_elm), | |
$Task = Elm.Task.make(_elm); | |
var _op = {}; | |
var start = function (config) { | |
var updateStep = F2(function (action,_p0) { | |
var _p1 = _p0; | |
var _p2 = A2(config.update,action,_p1._0); | |
var newModel = _p2._0; | |
var additionalEffects = _p2._1; | |
return {ctor: "_Tuple2" | |
,_0: newModel | |
,_1: $Effects.batch(_U.list([_p1._1,additionalEffects]))}; | |
}); | |
var update = F2(function (actions,_p3) { | |
var _p4 = _p3; | |
return A3($List.foldl, | |
updateStep, | |
{ctor: "_Tuple2",_0: _p4._0,_1: $Effects.none}, | |
actions); | |
}); | |
var messages = $Signal.mailbox(_U.list([])); | |
var singleton = function (action) { | |
return _U.list([action]); | |
}; | |
var address = A2($Signal.forwardTo,messages.address,singleton); | |
var inputs = $Signal.mergeMany(A2($List._op["::"], | |
messages.signal, | |
A2($List.map,$Signal.map(singleton),config.inputs))); | |
var effectsAndModel = A3($Signal.foldp, | |
update, | |
config.init, | |
inputs); | |
var model = A2($Signal.map,$Basics.fst,effectsAndModel); | |
return {html: A2($Signal.map,config.view(address),model) | |
,model: model | |
,tasks: A2($Signal.map, | |
function (_p5) { | |
return A2($Effects.toTask,messages.address,$Basics.snd(_p5)); | |
}, | |
effectsAndModel)}; | |
}; | |
var App = F3(function (a,b,c) { | |
return {html: a,model: b,tasks: c}; | |
}); | |
var Config = F4(function (a,b,c,d) { | |
return {init: a,update: b,view: c,inputs: d}; | |
}); | |
return _elm.StartApp.values = {_op: _op | |
,start: start | |
,Config: Config | |
,App: App}; | |
}; | |
Elm.DragAndDrop = Elm.DragAndDrop || {}; | |
Elm.DragAndDrop.make = function (_elm) { | |
"use strict"; | |
_elm.DragAndDrop = _elm.DragAndDrop || {}; | |
if (_elm.DragAndDrop.values) return _elm.DragAndDrop.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Automaton = Elm.Automaton.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Mouse = Elm.Mouse.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Signal = Elm.Signal.make(_elm); | |
var _op = {}; | |
var Picked = F3(function (a,b,c) { | |
return {ctor: "Picked",_0: a,_1: b,_2: c}; | |
}); | |
var Inside = function (a) { return {ctor: "Inside",_0: a};}; | |
var Outside = {ctor: "Outside"}; | |
var Hover = function (a) { return {ctor: "Hover",_0: a};}; | |
var Mouse = function (a) { return {ctor: "Mouse",_0: a};}; | |
var Release = {ctor: "Release"}; | |
var MoveBy = function (a) { return {ctor: "MoveBy",_0: a};}; | |
var Lift = {ctor: "Lift"}; | |
var automatonStep = F2(function (event,old) { | |
var _p0 = {ctor: "_Tuple2",_0: old,_1: event}; | |
_v0_6: do { | |
if (_p0.ctor === "_Tuple2") { | |
if (_p0._1.ctor === "Mouse") { | |
switch (_p0._0.ctor) | |
{case "Inside": if (_p0._1._0.ctor === "StartAt") { | |
var _p1 = _p0._0._0; | |
return {ctor: "_Tuple2" | |
,_0: $Maybe.Just({ctor: "_Tuple2",_0: _p1,_1: Lift}) | |
,_1: A3(Picked,_p1,_p0._1._0._0,$Maybe.Nothing)}; | |
} else { | |
break _v0_6; | |
} | |
case "Picked": switch (_p0._1._0.ctor) | |
{case "MoveFromTo": var _p5 = _p0._1._0._1; | |
var _p4 = _p0._0._0; | |
var _p2 = _p5; | |
var x$ = _p2._0; | |
var y$ = _p2._1; | |
var _p3 = _p0._0._1; | |
var x = _p3._0; | |
var y = _p3._1; | |
return {ctor: "_Tuple2" | |
,_0: $Maybe.Just({ctor: "_Tuple2" | |
,_0: _p4 | |
,_1: MoveBy({ctor: "_Tuple2",_0: x$ - x,_1: y$ - y})}) | |
,_1: A3(Picked,_p4,_p5,_p0._0._2)}; | |
case "EndAt": var _p6 = _p0._0._0; | |
return {ctor: "_Tuple2" | |
,_0: $Maybe.Just({ctor: "_Tuple2",_0: _p6,_1: Release}) | |
,_1: Inside(A2($Maybe.withDefault,_p6,_p0._0._2))}; | |
default: break _v0_6;} | |
default: break _v0_6;} | |
} else { | |
switch (_p0._0.ctor) | |
{case "Outside": if (_p0._1._0.ctor === "Just") { | |
return {ctor: "_Tuple2" | |
,_0: $Maybe.Nothing | |
,_1: Inside(_p0._1._0._0)}; | |
} else { | |
break _v0_6; | |
} | |
case "Inside": return {ctor: "_Tuple2" | |
,_0: $Maybe.Nothing | |
,_1: A2($Maybe.withDefault, | |
Outside, | |
A2($Maybe.map,Inside,_p0._1._0))}; | |
default: return {ctor: "_Tuple2" | |
,_0: $Maybe.Nothing | |
,_1: A3(Picked,_p0._0._0,_p0._0._1,_p0._1._0)};} | |
} | |
} else { | |
break _v0_6; | |
} | |
} while (false); | |
return {ctor: "_Tuple2",_0: $Maybe.Nothing,_1: old}; | |
}); | |
var automaton = function (inside) { | |
return A2($Automaton.hiddenState, | |
A2($Maybe.withDefault,Outside,A2($Maybe.map,Inside,inside)), | |
automatonStep); | |
}; | |
var EndAt = function (a) { return {ctor: "EndAt",_0: a};}; | |
var MoveFromTo = F2(function (a,b) { | |
return {ctor: "MoveFromTo",_0: a,_1: b}; | |
}); | |
var StartAt = function (a) { | |
return {ctor: "StartAt",_0: a}; | |
}; | |
var mouseEvents = function () { | |
var isJust = function (b) { | |
var _p7 = b; | |
if (_p7.ctor === "Just") { | |
return true; | |
} else { | |
return false; | |
} | |
}; | |
var assertEqual = $Basics.always; | |
var f = F2(function (_p8,old) { | |
var _p9 = _p8; | |
var _p11 = _p9._1; | |
var _p10 = {ctor: "_Tuple2",_0: old,_1: _p9._0}; | |
_v3_5: do { | |
_v3_4: do { | |
if (_p10.ctor === "_Tuple2") { | |
if (_p10._0.ctor === "Just") { | |
switch (_p10._0._0.ctor) | |
{case "StartAt": if (_p10._1 === true) { | |
return $Maybe.Just(A2(MoveFromTo,_p10._0._0._0,_p11)); | |
} else { | |
return $Maybe.Just(EndAt(A2(assertEqual, | |
_p10._0._0._0, | |
_p11))); | |
} | |
case "MoveFromTo": if (_p10._1 === true) { | |
return $Maybe.Just(A2(MoveFromTo,_p10._0._0._1,_p11)); | |
} else { | |
return $Maybe.Just(EndAt(A2(assertEqual, | |
_p10._0._0._1, | |
_p11))); | |
} | |
default: if (_p10._1 === true) { | |
break _v3_4; | |
} else { | |
break _v3_5; | |
}} | |
} else { | |
if (_p10._1 === true) { | |
break _v3_4; | |
} else { | |
break _v3_5; | |
} | |
} | |
} else { | |
break _v3_5; | |
} | |
} while (false); | |
return $Maybe.Just(StartAt(_p11)); | |
} while (false); | |
return $Maybe.Nothing; | |
}); | |
return A2($Signal.map, | |
$Maybe.withDefault(EndAt({ctor: "_Tuple2",_0: 0,_1: 0})), | |
A3($Signal.filter, | |
isJust, | |
$Maybe.Nothing, | |
A3($Signal.foldp, | |
f, | |
$Maybe.Nothing, | |
A3($Signal.map2, | |
F2(function (v0,v1) { | |
return {ctor: "_Tuple2",_0: v0,_1: v1}; | |
}), | |
$Mouse.isDown, | |
$Mouse.position)))); | |
}(); | |
var trackMany = F2(function (inside,hover) { | |
return A3($Automaton.run, | |
automaton(inside), | |
$Maybe.Nothing, | |
A2($Signal.merge, | |
A2($Signal.map,Mouse,mouseEvents), | |
A2($Signal.map,Hover,hover))); | |
}); | |
var track = F2(function (inside,hover) { | |
var btm = function (b) { | |
return b ? $Maybe.Just({ctor: "_Tuple0"}) : $Maybe.Nothing; | |
}; | |
return A2($Signal.map, | |
$Maybe.map($Basics.snd), | |
A2(trackMany,btm(inside),A2($Signal.map,btm,hover))); | |
}); | |
return _elm.DragAndDrop.values = {_op: _op | |
,mouseEvents: mouseEvents | |
,track: track | |
,trackMany: trackMany | |
,automaton: automaton | |
,StartAt: StartAt | |
,MoveFromTo: MoveFromTo | |
,EndAt: EndAt | |
,Lift: Lift | |
,MoveBy: MoveBy | |
,Release: Release | |
,Mouse: Mouse | |
,Hover: Hover}; | |
}; | |
Elm.Affine = Elm.Affine || {}; | |
Elm.Affine.make = function (_elm) { | |
"use strict"; | |
_elm.Affine = _elm.Affine || {}; | |
if (_elm.Affine.values) return _elm.Affine.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Signal = Elm.Signal.make(_elm); | |
var _op = {}; | |
var apply = F2(function (t,_p0) { | |
var _p1 = _p0; | |
var _p3 = _p1._1; | |
var _p2 = _p1._0; | |
var y$ = t.c * _p2 + t.d * _p3 + t.y; | |
var x$ = t.a * _p2 + t.b * _p3 + t.x; | |
return {ctor: "_Tuple2",_0: x$,_1: y$}; | |
}); | |
var Transform = F6(function (a,b,c,d,e,f) { | |
return {a: a,b: b,c: c,d: d,x: e,y: f}; | |
}); | |
var identity = A6(Transform,1,0,0,1,0,0); | |
var scale = function (factor) { | |
return A6(Transform,factor,0,0,factor,0,0); | |
}; | |
var translate = function (_p4) { | |
var _p5 = _p4; | |
return A6(Transform,1,0,0,1,_p5._0,_p5._1); | |
}; | |
var inverse = function (t) { | |
var denom = t.a * t.d - t.b * t.c; | |
var a = t.d / denom; | |
var b = 0 - t.b / denom; | |
var c = 0 - t.c / denom; | |
var d = t.a / denom; | |
var x = (t.b * t.y - t.d * t.x) / denom; | |
var y = (t.c * t.x - t.a * t.y) / denom; | |
return A6(Transform,a,b,c,d,x,y); | |
}; | |
var multiply = F2(function (t1,t2) { | |
var y = t1.c * t2.x + t1.d * t2.y + t1.y; | |
var d = t1.c * t2.b + t1.d * t2.d; | |
var c = t1.c * t2.a + t1.d * t2.c; | |
var x = t1.a * t2.x + t1.b * t2.y + t1.x; | |
var b = t1.a * t2.b + t1.b * t2.d; | |
var a = t1.a * t2.a + t1.b * t2.c; | |
return A6(Transform,a,b,c,d,x,y); | |
}); | |
return _elm.Affine.values = {_op: _op | |
,Transform: Transform | |
,identity: identity | |
,scale: scale | |
,translate: translate | |
,apply: apply | |
,inverse: inverse | |
,multiply: multiply}; | |
}; | |
Elm.App = Elm.App || {}; | |
Elm.App.make = function (_elm) { | |
"use strict"; | |
_elm.App = _elm.App || {}; | |
if (_elm.App.values) return _elm.App.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$Effects = Elm.Effects.make(_elm), | |
$Html = Elm.Html.make(_elm), | |
$Html$Attributes = Elm.Html.Attributes.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Signal = Elm.Signal.make(_elm), | |
$String = Elm.String.make(_elm), | |
$Svg = Elm.Svg.make(_elm), | |
$Svg$Attributes = Elm.Svg.Attributes.make(_elm); | |
var _op = {}; | |
var unitHexagon = _U.list([{ctor: "_Tuple2",_0: 0,_1: 1} | |
,{ctor: "_Tuple2",_0: $Basics.sqrt(3) / 2,_1: 1 / 2} | |
,{ctor: "_Tuple2",_0: $Basics.sqrt(3) / 2,_1: -1 / 2} | |
,{ctor: "_Tuple2",_0: 0,_1: -1} | |
,{ctor: "_Tuple2",_0: (0 - $Basics.sqrt(3)) / 2,_1: -1 / 2} | |
,{ctor: "_Tuple2",_0: (0 - $Basics.sqrt(3)) / 2,_1: 1 / 2}]); | |
var scaledHexagon = function (scale) { | |
return A2($String.join, | |
" ", | |
A2($List.map, | |
function (_p0) { | |
var _p1 = _p0; | |
return A2($Basics._op["++"], | |
$Basics.toString(_p1._0), | |
A2($Basics._op["++"],",",$Basics.toString(_p1._1))); | |
}, | |
A2($List.map, | |
function (_p2) { | |
var _p3 = _p2; | |
return {ctor: "_Tuple2",_0: _p3._0 * scale,_1: _p3._1 * scale}; | |
}, | |
unitHexagon))); | |
}; | |
var fromXYtoIJ = function (_p4) { | |
var _p5 = _p4; | |
var _p6 = _p5._1; | |
var j = 2 * _p6 * $Basics.sqrt(3) / 3; | |
var i = _p5._0 - $Basics.sqrt(3) * _p6 / 3; | |
return {ctor: "_Tuple2",_0: i,_1: j}; | |
}; | |
var fromXYtoClosestIJ = function (_p7) { | |
var _p8 = _p7; | |
var _p9 = fromXYtoIJ({ctor: "_Tuple2",_0: _p8._0,_1: _p8._1}); | |
var i = _p9._0; | |
var j = _p9._1; | |
return {ctor: "_Tuple2" | |
,_0: $Basics.round(i) | |
,_1: $Basics.round(j)}; | |
}; | |
var fromIJtoXY = function (_p10) { | |
var _p11 = _p10; | |
var j$ = $Basics.toFloat(_p11._1); | |
var _p12 = {ctor: "_Tuple2" | |
,_0: 0.5 * j$ | |
,_1: $Basics.sqrt(3) * 0.5 * j$}; | |
var x$ = _p12._0; | |
var y$ = _p12._1; | |
var i$ = $Basics.toFloat(_p11._0); | |
var _p13 = {ctor: "_Tuple2",_0: i$,_1: 0}; | |
var x = _p13._0; | |
var y = _p13._1; | |
return {ctor: "_Tuple2",_0: x + x$,_1: y + y$}; | |
}; | |
var viewStyle = function (model) { | |
return $Html$Attributes.style(_U.list([{ctor: "_Tuple2" | |
,_0: "position" | |
,_1: "absolute"} | |
,{ctor: "_Tuple2" | |
,_0: "left" | |
,_1: A2($Basics._op["++"],$Basics.toString(model.x),"px")} | |
,{ctor: "_Tuple2" | |
,_0: "top" | |
,_1: A2($Basics._op["++"],$Basics.toString(model.y),"px")}])); | |
}; | |
var Drop = function (a) { return {ctor: "Drop",_0: a};}; | |
var Move = function (a) { return {ctor: "Move",_0: a};}; | |
var Click = function (a) { return {ctor: "Click",_0: a};}; | |
var NoOp = {ctor: "NoOp"}; | |
var init = function (params) { | |
var _p14 = fromIJtoXY({ctor: "_Tuple2" | |
,_0: params.i | |
,_1: params.j}); | |
var x = _p14._0; | |
var y = _p14._1; | |
return {ctor: "_Tuple2" | |
,_0: {id: params.id | |
,i: params.i | |
,j: params.j | |
,x: x | |
,y: y | |
,color: params.color | |
,selected: false} | |
,_1: $Effects.none}; | |
}; | |
var Model = F7(function (a,b,c,d,e,f,g) { | |
return {id: a,i: b,j: c,x: d,y: e,color: f,selected: g}; | |
}); | |
var Params = F4(function (a,b,c,d) { | |
return {id: a,i: b,j: c,color: d}; | |
}); | |
var selectedScale = 1.1; | |
var hexScale = 0.55; | |
var view = F2(function (address,model) { | |
var scale = model.selected ? hexScale * selectedScale : hexScale; | |
return A2($Svg.polygon, | |
_U.list([$Svg$Attributes.points(scaledHexagon(scale)) | |
,$Svg$Attributes.transform(A2($Basics._op["++"], | |
"translate(", | |
A2($Basics._op["++"], | |
$Basics.toString(model.x), | |
A2($Basics._op["++"], | |
",", | |
A2($Basics._op["++"],$Basics.toString(model.y),")"))))) | |
,$Svg$Attributes.style(A2($Basics._op["++"], | |
"fill:#", | |
model.color))]), | |
_U.list([])); | |
}); | |
var isPointInside = F2(function (_p15,model) { | |
var _p16 = _p15; | |
var _p17 = {ctor: "_Tuple2" | |
,_0: _p16._0 - model.x | |
,_1: _p16._1 - model.y}; | |
var translatedX = _p17._0; | |
var translatedY = _p17._1; | |
var _p18 = {ctor: "_Tuple2" | |
,_0: translatedX / hexScale | |
,_1: translatedY / hexScale}; | |
var x = _p18._0; | |
var y = _p18._1; | |
return _U.cmp(x,0 - $Basics.sqrt(3) / 2) > 0 && (_U.cmp(x, | |
$Basics.sqrt(3) / 2) < 0 && (_U.cmp(y, | |
0 - x * $Basics.sqrt(3) / 3 + 1) < 0 && (_U.cmp(y, | |
x * $Basics.sqrt(3) / 3 + 1) < 0 && (_U.cmp(y, | |
0 - x * $Basics.sqrt(3) / 3 - 1) > 0 && _U.cmp(y, | |
x * $Basics.sqrt(3) / 3 - 1) > 0)))); | |
}); | |
var update = F2(function (action,model) { | |
var _p19 = action; | |
switch (_p19.ctor) | |
{case "NoOp": return {ctor: "_Tuple2" | |
,_0: model | |
,_1: $Effects.none}; | |
case "Click": return A2(isPointInside, | |
{ctor: "_Tuple2",_0: _p19._0._0,_1: _p19._0._1}, | |
model) ? {ctor: "_Tuple2" | |
,_0: _U.update(model,{selected: true}) | |
,_1: $Effects.none} : {ctor: "_Tuple2" | |
,_0: _U.update(model,{selected: false}) | |
,_1: $Effects.none}; | |
case "Move": return {ctor: "_Tuple2" | |
,_0: _U.update(model, | |
{x: model.x + _p19._0._0,y: model.y + _p19._0._1}) | |
,_1: $Effects.none}; | |
default: var _p22 = _p19._0._1; | |
var _p21 = _p19._0._0; | |
var _p20 = fromIJtoXY({ctor: "_Tuple2",_0: _p21,_1: _p22}); | |
var x = _p20._0; | |
var y = _p20._1; | |
return {ctor: "_Tuple2" | |
,_0: _U.update(model, | |
{i: _p21,j: _p22,x: x,y: y,selected: false}) | |
,_1: $Effects.none};} | |
}); | |
return _elm.App.values = {_op: _op | |
,hexScale: hexScale | |
,selectedScale: selectedScale | |
,Params: Params | |
,Model: Model | |
,init: init | |
,NoOp: NoOp | |
,Click: Click | |
,Move: Move | |
,Drop: Drop | |
,update: update | |
,viewStyle: viewStyle | |
,view: view | |
,fromIJtoXY: fromIJtoXY | |
,fromXYtoIJ: fromXYtoIJ | |
,fromXYtoClosestIJ: fromXYtoClosestIJ | |
,unitHexagon: unitHexagon | |
,scaledHexagon: scaledHexagon | |
,isPointInside: isPointInside}; | |
}; | |
Elm.Native.Primer = Elm.Native.Primer || {}; | |
Elm.Native.Primer.make = function(elm) { | |
elm.Native = elm.Native || {}; | |
elm.Native.Primer = elm.Native.Primer || {}; | |
if (elm.Native.Primer.values) return elm.Native.Primer.values; | |
var NS = Elm.Native.Signal.make(elm); | |
return elm.Native.Primer.values = { | |
prime: function(sig){ | |
setTimeout(function(){ | |
elm.notify(sig.id, sig.value) | |
}, 1); | |
return sig; | |
} | |
}; | |
}; | |
Elm.Primer = Elm.Primer || {}; | |
Elm.Primer.make = function (_elm) { | |
"use strict"; | |
_elm.Primer = _elm.Primer || {}; | |
if (_elm.Primer.values) return _elm.Primer.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Native$Primer = Elm.Native.Primer.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Signal = Elm.Signal.make(_elm); | |
var _op = {}; | |
var prime = $Native$Primer.prime; | |
return _elm.Primer.values = {_op: _op,prime: prime}; | |
}; | |
Elm.Native.Scroll = Elm.Native.Scroll || {}; | |
Elm.Native.Scroll.make = function(elm) { | |
elm.Native = elm.Native || {}; | |
elm.Native.Scroll = elm.Native.Scroll || {}; | |
if (elm.Native.Scroll.values) return elm.Native.Scroll.values; | |
var Signal = Elm.Signal.make(elm); | |
var Utils = Elm.Native.Utils.make(elm); | |
/* | |
* Thanks http://phrogz.net/JS/wheeldelta.html | |
*/ | |
var wheelDistance = function(evt) { | |
if (!evt) evt = event; | |
var w = evt.wheelDelta; | |
var d = evt.detail; | |
var r = 0.0; | |
if (d) { | |
if (w) { | |
r = w / d / 40 * (d > 0 ? 1 : -1); // Opera | |
} else { | |
r = -d / 3; // Firefox | |
} | |
} else { | |
r = w / 120; // IE / Safari / Chrome | |
} | |
// prevent other wheel events and bubbling in general | |
if (evt.stopPropagation) | |
evt.stopPropagation(); | |
evt.cancelBubble = true; | |
if (evt.preventDefault) | |
evt.preventDefault(); | |
evt.returnValue = false; | |
elm.notify(delta.id, r); | |
}; | |
var delta = Signal.constant(0); | |
// var node = elm.display === ElmRuntime.Display.FULLSCREEN ? document : elm.node; | |
var node = elm.node; | |
// elm.addListener([delta.id], node, 'wheel', wheelDistance); | |
elm.addListener([delta.id], node, 'DOMMouseScroll', wheelDistance); | |
elm.addListener([delta.id], node, 'mousewheel', wheelDistance); | |
return elm.Native.Scroll.values = { | |
delta : delta | |
}; | |
}; | |
Elm.Scroll = Elm.Scroll || {}; | |
Elm.Scroll.make = function (_elm) { | |
"use strict"; | |
_elm.Scroll = _elm.Scroll || {}; | |
if (_elm.Scroll.values) return _elm.Scroll.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Native$Scroll = Elm.Native.Scroll.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Signal = Elm.Signal.make(_elm); | |
var _op = {}; | |
var delta = $Native$Scroll.delta; | |
return _elm.Scroll.values = {_op: _op,delta: delta}; | |
}; | |
Elm.Seed = Elm.Seed || {}; | |
Elm.Seed.Apps = Elm.Seed.Apps || {}; | |
Elm.Seed.Apps.make = function (_elm) { | |
"use strict"; | |
_elm.Seed = _elm.Seed || {}; | |
_elm.Seed.Apps = _elm.Seed.Apps || {}; | |
if (_elm.Seed.Apps.values) return _elm.Seed.Apps.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Signal = Elm.Signal.make(_elm); | |
var _op = {}; | |
var apps = _U.list([{id: "ca083c81-36fe-4db0-8f44-aa42a63c4ac4" | |
,i: 0 | |
,j: 0 | |
,color: "ffe96b"} | |
,{id: "655cb143-1cd2-4266-bd84-1d03bf7deda0" | |
,i: 1 | |
,j: -1 | |
,color: "f99d1c"} | |
,{id: "a06ce541-9178-4b40-a4f9-70b9ac554d66" | |
,i: 0 | |
,j: 1 | |
,color: "f04e29"} | |
,{id: "cbd798d8-0657-4791-bf52-3a8f86bda1c7" | |
,i: -1 | |
,j: 1 | |
,color: "d92c81"} | |
,{id: "73823fed-30b0-4b10-bd0a-6d348326295e" | |
,i: -1 | |
,j: 0 | |
,color: "2d479d"} | |
,{id: "270b8324-7dc6-463b-a88e-2ef645f90cc3" | |
,i: 0 | |
,j: -2 | |
,color: "00a0e4"} | |
,{id: "d9d0a75c-2150-4328-9527-acd7e5c52cb5" | |
,i: 1 | |
,j: -2 | |
,color: "00b9ad"}]); | |
return _elm.Seed.Apps.values = {_op: _op,apps: apps}; | |
}; | |
Elm.Launcher = Elm.Launcher || {}; | |
Elm.Launcher.make = function (_elm) { | |
"use strict"; | |
_elm.Launcher = _elm.Launcher || {}; | |
if (_elm.Launcher.values) return _elm.Launcher.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Affine = Elm.Affine.make(_elm), | |
$App = Elm.App.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$DragAndDrop = Elm.DragAndDrop.make(_elm), | |
$Effects = Elm.Effects.make(_elm), | |
$Html = Elm.Html.make(_elm), | |
$Html$Attributes = Elm.Html.Attributes.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Mouse = Elm.Mouse.make(_elm), | |
$Primer = Elm.Primer.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Scroll = Elm.Scroll.make(_elm), | |
$Seed$Apps = Elm.Seed.Apps.make(_elm), | |
$Signal = Elm.Signal.make(_elm), | |
$Svg = Elm.Svg.make(_elm), | |
$Svg$Attributes = Elm.Svg.Attributes.make(_elm), | |
$Task = Elm.Task.make(_elm), | |
$Window = Elm.Window.make(_elm); | |
var _op = {}; | |
var fromInternaltoUserCoords = function (model) { | |
return $Affine.apply(model.transform); | |
}; | |
var fromUserToInternalCoords = function (model) { | |
return $Affine.apply($Affine.inverse(model.transform)); | |
}; | |
var phantomPosition = F2(function (model,maybeAppModel) { | |
var _p0 = maybeAppModel; | |
if (_p0.ctor === "Just") { | |
var _p1 = _p0._0; | |
return $Maybe.Just($App.fromXYtoClosestIJ({ctor: "_Tuple2" | |
,_0: _p1.x | |
,_1: _p1.y})); | |
} else { | |
return $Maybe.Nothing; | |
} | |
}); | |
var phantomView = F2(function (model,maybeIJ) { | |
var _p2 = maybeIJ; | |
if (_p2.ctor === "Just") { | |
var _p5 = _p2._0._1; | |
var _p4 = _p2._0._0; | |
if (A2($List.any, | |
function (app) { | |
return _U.eq({ctor: "_Tuple2",_0: app.i,_1: app.j}, | |
{ctor: "_Tuple2",_0: _p4,_1: _p5}); | |
}, | |
model.apps)) return $Html.text(""); else { | |
var _p3 = $App.fromIJtoXY({ctor: "_Tuple2",_0: _p4,_1: _p5}); | |
var x = _p3._0; | |
var y = _p3._1; | |
return A2($Svg.g, | |
_U.list([$Svg$Attributes.overflow("visible") | |
,$Svg$Attributes.transform(A2($Basics._op["++"], | |
"translate(", | |
A2($Basics._op["++"], | |
$Basics.toString(x), | |
A2($Basics._op["++"], | |
",", | |
A2($Basics._op["++"],$Basics.toString(y),")")))))]), | |
_U.list([A2($Svg.polygon, | |
_U.list([$Svg$Attributes.points($App.scaledHexagon($App.hexScale)) | |
,$Svg$Attributes.style("fill:#eeeeee")]), | |
_U.list([]))])); | |
} | |
} else { | |
return $Html.text(""); | |
} | |
}); | |
var ScrollAction = function (a) { | |
return {ctor: "ScrollAction",_0: a}; | |
}; | |
var MouseAction = function (a) { | |
return {ctor: "MouseAction",_0: a}; | |
}; | |
var WindowResize = function (a) { | |
return {ctor: "WindowResize",_0: a}; | |
}; | |
var AppMsg = F2(function (a,b) { | |
return {ctor: "AppMsg",_0: a,_1: b}; | |
}); | |
var updateApp = F3(function (id,action,model) { | |
if (_U.eq(id,model.id)) { | |
var _p6 = A2($App.update,action,model); | |
var newApp = _p6._0; | |
var fx = _p6._1; | |
return {ctor: "_Tuple2" | |
,_0: newApp | |
,_1: A2($Effects.map,AppMsg(id),fx)}; | |
} else return {ctor: "_Tuple2",_0: model,_1: $Effects.none}; | |
}); | |
var update = F2(function (action,model) { | |
var _p7 = action; | |
switch (_p7.ctor) | |
{case "AddApp": var _p8 = $App.init(_p7._0); | |
var newApp = _p8._0; | |
var fx = _p8._1; | |
return {ctor: "_Tuple2" | |
,_0: _U.update(model, | |
{apps: A2($Basics._op["++"],model.apps,_U.list([newApp]))}) | |
,_1: $Effects.none}; | |
case "AppMsg": var _p9 = $List.unzip(A2($List.map, | |
A2(updateApp,_p7._0,_p7._1), | |
model.apps)); | |
var newAppList = _p9._0; | |
var fxList = _p9._1; | |
return {ctor: "_Tuple2" | |
,_0: _U.update(model,{apps: newAppList}) | |
,_1: $Effects.batch(fxList)}; | |
case "WindowResize": var _p11 = _p7._0._1; | |
var _p10 = _p7._0._0; | |
return {ctor: "_Tuple2" | |
,_0: _U.update(model, | |
{width: _p10 | |
,height: _p11 | |
,transform: A2($Affine.multiply, | |
$Affine.translate({ctor: "_Tuple2" | |
,_0: $Basics.toFloat(_p10) / 2 | |
,_1: $Basics.toFloat(_p11) / 2}), | |
model.transform)}) | |
,_1: $Effects.none}; | |
case "MouseAction": var _p12 = _p7._0; | |
switch (_p12.ctor) | |
{case "StartAt": var _p13 = A2(fromUserToInternalCoords, | |
model, | |
{ctor: "_Tuple2" | |
,_0: $Basics.toFloat(_p12._0._0) | |
,_1: $Basics.toFloat(_p12._0._1)}); | |
var x$ = _p13._0; | |
var y$ = _p13._1; | |
var fx = $Effects.batch(A2($List.map, | |
function (action) { | |
return $Effects.task($Task.succeed(action)); | |
}, | |
A2($List.map, | |
function (app) { | |
return A2(AppMsg, | |
app.id, | |
$App.Click({ctor: "_Tuple2",_0: x$,_1: y$})); | |
}, | |
model.apps))); | |
return {ctor: "_Tuple2",_0: model,_1: fx}; | |
case "MoveFromTo": var _p21 = _p12._1._1; | |
var _p20 = _p12._0._1; | |
var _p19 = _p12._1._0; | |
var _p18 = _p12._0._0; | |
var selected = $List.head(A2($List.filter, | |
function (_) { | |
return _.selected; | |
}, | |
model.apps)); | |
var newModel = function () { | |
var _p14 = selected; | |
if (_p14.ctor === "Just") { | |
return model; | |
} else { | |
var translation = $Affine.translate({ctor: "_Tuple2" | |
,_0: $Basics.toFloat(_p19 - _p18) | |
,_1: $Basics.toFloat(_p21 - _p20)}); | |
return _U.update(model, | |
{transform: A2($Affine.multiply,translation,model.transform)}); | |
} | |
}(); | |
var _p15 = A2(fromUserToInternalCoords, | |
model, | |
{ctor: "_Tuple2" | |
,_0: $Basics.toFloat(_p19) | |
,_1: $Basics.toFloat(_p21)}); | |
var x2$ = _p15._0; | |
var y2$ = _p15._1; | |
var _p16 = A2(fromUserToInternalCoords, | |
model, | |
{ctor: "_Tuple2" | |
,_0: $Basics.toFloat(_p18) | |
,_1: $Basics.toFloat(_p20)}); | |
var x1$ = _p16._0; | |
var y1$ = _p16._1; | |
var fx = function () { | |
var _p17 = selected; | |
if (_p17.ctor === "Just") { | |
return $Effects.task($Task.succeed(A2(AppMsg, | |
_p17._0.id, | |
$App.Move({ctor: "_Tuple2",_0: x2$ - x1$,_1: y2$ - y1$})))); | |
} else { | |
return $Effects.none; | |
} | |
}(); | |
return {ctor: "_Tuple2",_0: newModel,_1: fx}; | |
default: var selected = $List.head(A2($List.filter, | |
function (_) { | |
return _.selected; | |
}, | |
model.apps)); | |
var _p22 = selected; | |
if (_p22.ctor === "Just") { | |
var _p24 = _p22._0; | |
var _p23 = $App.fromXYtoIJ({ctor: "_Tuple2" | |
,_0: _p24.x | |
,_1: _p24.y}); | |
var i = _p23._0; | |
var j = _p23._1; | |
if (A2($List.any, | |
function (app) { | |
return _U.eq({ctor: "_Tuple2",_0: app.i,_1: app.j}, | |
{ctor: "_Tuple2",_0: $Basics.round(i),_1: $Basics.round(j)}); | |
}, | |
model.apps)) { | |
var fx = $Effects.task($Task.succeed(A2(AppMsg, | |
_p24.id, | |
$App.Drop({ctor: "_Tuple2",_0: _p24.i,_1: _p24.j})))); | |
return {ctor: "_Tuple2",_0: model,_1: fx}; | |
} else { | |
var fx = $Effects.task($Task.succeed(A2(AppMsg, | |
_p24.id, | |
$App.Drop({ctor: "_Tuple2" | |
,_0: $Basics.round(i) | |
,_1: $Basics.round(j)})))); | |
return {ctor: "_Tuple2",_0: model,_1: fx}; | |
} | |
} else { | |
return {ctor: "_Tuple2",_0: model,_1: $Effects.none}; | |
}} | |
default: var _p25 = _p7._0; | |
var mouseTranslation = $Affine.translate({ctor: "_Tuple2" | |
,_0: $Basics.toFloat(_p25.x) | |
,_1: $Basics.toFloat(_p25.y)}); | |
var scaleFactor = Math.pow(2,_p25.delta / 25); | |
var newTransform = A2($Affine.multiply, | |
mouseTranslation, | |
A2($Affine.multiply, | |
$Affine.scale(scaleFactor), | |
A2($Affine.multiply, | |
$Affine.inverse(mouseTranslation), | |
model.transform))); | |
return {ctor: "_Tuple2" | |
,_0: _U.update(model,{transform: newTransform}) | |
,_1: $Effects.none};} | |
}); | |
var appView = F2(function (address,model) { | |
return A2($App.view, | |
A2($Signal.forwardTo,address,AppMsg(model.id)), | |
model); | |
}); | |
var view = F2(function (address,model) { | |
var unselected = A2($List.filter, | |
function (a) { | |
return $Basics.not(a.selected); | |
}, | |
model.apps); | |
var selected = A2($List.filter, | |
function (_) { | |
return _.selected; | |
}, | |
model.apps); | |
var phantom = A2(phantomPosition,model,$List.head(selected)); | |
var transformToString = function (t) { | |
return A2($Basics._op["++"], | |
$Basics.toString(t.a), | |
A2($Basics._op["++"], | |
" ", | |
A2($Basics._op["++"], | |
$Basics.toString(t.c), | |
A2($Basics._op["++"], | |
" ", | |
A2($Basics._op["++"], | |
$Basics.toString(t.b), | |
A2($Basics._op["++"], | |
" ", | |
A2($Basics._op["++"], | |
$Basics.toString(t.d), | |
A2($Basics._op["++"], | |
" ", | |
A2($Basics._op["++"], | |
$Basics.toString(t.x), | |
A2($Basics._op["++"]," ",$Basics.toString(t.y))))))))))); | |
}; | |
var transformParams = A2($Basics._op["++"], | |
"matrix(", | |
A2($Basics._op["++"],transformToString(model.transform),")")); | |
return A2($Html.div, | |
_U.list([$Html$Attributes.id("app")]), | |
_U.list([A2($Svg.svg, | |
_U.list([$Svg$Attributes.width($Basics.toString(model.width)) | |
,$Svg$Attributes.height($Basics.toString(model.height)) | |
,$Svg$Attributes.version("1.1")]), | |
_U.list([A2($Svg.g, | |
_U.list([$Svg$Attributes.transform(transformParams)]), | |
A2($Basics._op["++"], | |
A2($List.map,appView(address),unselected), | |
A2($Basics._op["++"], | |
_U.list([A2(phantomView,model,phantom)]), | |
A2($List.map,appView(address),selected))))]))])); | |
}); | |
var AddApp = function (a) { return {ctor: "AddApp",_0: a};}; | |
var loadSeedData = $Effects.batch(A2($List.map, | |
function (app) { | |
return $Effects.task($Task.succeed(AddApp(app))); | |
}, | |
$Seed$Apps.apps)); | |
var ScrollData = F3(function (a,b,c) { | |
return {x: a,y: b,delta: c}; | |
}); | |
var init = {ctor: "_Tuple2" | |
,_0: {apps: _U.list([]) | |
,width: 0 | |
,height: 0 | |
,transform: $Affine.scale(100)} | |
,_1: loadSeedData}; | |
var Model = F4(function (a,b,c,d) { | |
return {apps: a,width: b,height: c,transform: d}; | |
}); | |
var inputs = function () { | |
var scrollActions = A2($Signal.sampleOn, | |
$Scroll.delta, | |
A3($Signal.map2, | |
F2(function (pos,delta) { | |
return A3(ScrollData, | |
$Basics.fst(pos), | |
$Basics.snd(pos), | |
delta); | |
}), | |
$Mouse.position, | |
$Scroll.delta)); | |
return $Signal.mergeMany(_U.list([A2($Signal.map, | |
WindowResize, | |
$Primer.prime($Window.dimensions)) | |
,A2($Signal.map,MouseAction,$DragAndDrop.mouseEvents) | |
,A2($Signal.map,ScrollAction,scrollActions)])); | |
}(); | |
return _elm.Launcher.values = {_op: _op | |
,inputs: inputs | |
,Model: Model | |
,init: init | |
,ScrollData: ScrollData | |
,AddApp: AddApp | |
,AppMsg: AppMsg | |
,WindowResize: WindowResize | |
,MouseAction: MouseAction | |
,ScrollAction: ScrollAction | |
,update: update | |
,updateApp: updateApp | |
,view: view | |
,appView: appView | |
,phantomView: phantomView | |
,loadSeedData: loadSeedData | |
,phantomPosition: phantomPosition | |
,fromUserToInternalCoords: fromUserToInternalCoords | |
,fromInternaltoUserCoords: fromInternaltoUserCoords}; | |
}; | |
Elm.Main = Elm.Main || {}; | |
Elm.Main.make = function (_elm) { | |
"use strict"; | |
_elm.Main = _elm.Main || {}; | |
if (_elm.Main.values) return _elm.Main.values; | |
var _U = Elm.Native.Utils.make(_elm), | |
$Basics = Elm.Basics.make(_elm), | |
$Debug = Elm.Debug.make(_elm), | |
$Effects = Elm.Effects.make(_elm), | |
$Launcher = Elm.Launcher.make(_elm), | |
$List = Elm.List.make(_elm), | |
$Maybe = Elm.Maybe.make(_elm), | |
$Result = Elm.Result.make(_elm), | |
$Signal = Elm.Signal.make(_elm), | |
$StartApp = Elm.StartApp.make(_elm), | |
$Task = Elm.Task.make(_elm); | |
var _op = {}; | |
var app = $StartApp.start({init: $Launcher.init | |
,update: $Launcher.update | |
,view: $Launcher.view | |
,inputs: _U.list([$Launcher.inputs])}); | |
var main = app.html; | |
var tasks = Elm.Native.Task.make(_elm).performSignal("tasks", | |
app.tasks); | |
return _elm.Main.values = {_op: _op,app: app,main: main}; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment