@girders-elements/core
Version:
Girders Elements is an architectural framework that assists with building data-driven apps with React or React Native.
220 lines (86 loc) • 2.68 kB
JavaScript
Object.defineProperty(exports,"__esModule",{value:true});exports.onPost=exports.onPre=exports.visit=exports.POST=exports.PRE=undefined;var _curry=require('ramda/src/curry');var _curry2=_interopRequireDefault(_curry);
var _has=require('ramda/src/has');var _has2=_interopRequireDefault(_has);
var _zipper=require('./zipper');function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}
var PRE=exports.PRE='PRE';
var POST=exports.POST='POST';
function visitItem(event,initialItem,initialState,visitors){
var _item=initialItem;
var _state=initialState;
var _stop=false;
var _cut=false;
var i=0;
for(;i<visitors.length;i++){
var visitor=visitors[i];
var res=visitor(event,_item,_state)||{};var
item=
res.item,state=res.state,stop=res.stop,cut=res.cut;
if((0,_has2.default)('item',res))_item=item;
if((0,_has2.default)('state',res))_state=state;
if(stop||cut){
_stop=stop;
_cut=cut;
break;
}
}
return{item:_item,state:_state,stop:_stop,cut:_cut};
}
function visitLocation(event,zipper,_state,visitors){
var res=visitItem(event,(0,_zipper.value)(zipper),_state,visitors)||{};var
item=
res.item,state=res.state,stop=res.stop,cut=res.cut;
return{
loc:res.hasOwnProperty('item')?(0,_zipper.replace)(item,zipper):zipper,
state:res.hasOwnProperty('state')?state:_state,
stop:stop,
cut:cut};
}
var DOWN='DOWN';
var RIGHT='RIGHT';
function finishVisit(loc,state){
return{item:(0,_zipper.value)((0,_zipper.root)(loc)),state:state};
}
var visit=exports.visit=(0,_curry2.default)(function visit(visitors,initialState,initialZipper){
var direction=DOWN;
var z=initialZipper;
var state=initialState;
var isFirst=true;
while(isFirst||(0,_zipper.isNotTop)(z)){
isFirst=false;
if(direction===DOWN){
var _res=visitLocation(PRE,z,state,visitors);
state=_res.state;
z=_res.loc;
if(_res.stop)return finishVisit(z,state);
if(!_res.cut&&(0,_zipper.canGoDown)(z)){
z=(0,_zipper.down)(z);
}else{
direction=RIGHT;
}
}else if(direction===RIGHT){
var _res2=visitLocation(POST,z,state,visitors);
state=_res2.state;
z=_res2.loc;
if(_res2.stop)return finishVisit(z,state);
if((0,_zipper.canGoRight)(z)){
z=(0,_zipper.right)(z);
direction=DOWN;
}else{
z=(0,_zipper.up)(z);
direction=RIGHT;
}
}
}
var res=visitLocation(POST,z,state,visitors);
state=res.state;
z=res.loc;
return{
item:(0,_zipper.value)(z),
zipper:z,
state:state};
});
var onEvent=(0,_curry2.default)(
function(matchEvent,fn){return(
function(event,item,state){return(
event===matchEvent?fn(item,state):undefined);});});
var onPre=exports.onPre=onEvent(PRE);
var onPost=exports.onPost=onEvent(POST);