UNPKG

@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
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);