A full featured blog in RiotJS
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

75 lines
1.3 KiB

import im from 'immutable';
function Zipper(left, right) {
return {
"left" : left,
"right" : right
};
}
function toJS(z) {
return [z.left.toJS(), z.right.toJS()];
}
function fromList(xs) {
return Zipper(im.Stack(), im.Stack(xs));
}
function focus(z, def_val) {
var head = z.right.first();
if (head) {
return head;
}
return def_val;
}
function reset(z) {
return Zipper(im.Stack(), z.left.reverse().concat(z.right));
}
function swap(z) {
return Zipper(im.Stack(z.right.reverse().shift()), im.Stack([z.right.last()]));
}
function goRight(z) {
if (z.right.size == 1) {
return reset(z);
}
return Zipper(z.left.unshift(z.right.first()),
z.right.shift());
}
function goLeft(z) {
if (z.left.size == 0) {
return swap(z);
}
return Zipper(z.left.shift(),
z.right.unshift(z.left.first()));
}
function extend(z, xs) {
return Zipper(z.left, z.right.concat(xs));
}
function removeCurrent(z) {
return Zipper(z.left, z.right.shift());
}
function insert(x, z) {
return Zipper(z.left, z.right.unshift(x));
}
var empty = fromList([]);
export default {
"Zipper" : fromList,
"focus" : focus,
"goRight" : goRight,
"goLeft" : goLeft,
"empty" : empty,
"fromList" : fromList,
"extend" : extend,
"removeCurrent" : removeCurrent,
"insert" : insert,
"toJS" : toJS
};