|
@@ -39,21 +39,21 @@ o(Key,FK,Dir,Fx) ->
|
|
|
S = size(FK),
|
|
|
|
|
|
Run = fun (F,K,H,V,Acc) when binary_part(K,{0,S}) == FK -> {F(H,Dir),H,[V|Acc]}; % continue
|
|
|
- (_,K,H,V,Acc) -> close_it(H), % gracely quit
|
|
|
- throw({ok,fd(K),bt(V),[bt(A1)||A1<-Acc]}) end,
|
|
|
+ (_,K,H,V,Acc) -> close_it(H), % failsafe close
|
|
|
+ throw({ok,fd(K),bt(V),[bt(A1)||A1<-Acc]}) end, % acc unfold
|
|
|
|
|
|
RangeCheckRun = fun(F,K,V,H) -> case F(H,prev) of
|
|
|
- {ok,K1,V1} when binary_part(K,{0,S}) == FK -> {{ok,K1,V1},H,[V]}; % return
|
|
|
- {ok,K1,V1} -> Run(F,K1,H,V1,[]);
|
|
|
- E -> E % violation
|
|
|
+ {ok,K1,V1} when binary_part(K,{0,S}) == FK -> {{ok,K1,V1},H,[V]}; % return (range-check error)
|
|
|
+ {ok,K1,V1} -> Run(F,K1,H,V1,[]); % run prev-take chain
|
|
|
+ E -> E % violation
|
|
|
end end,
|
|
|
|
|
|
- It = fun(F,{ok,H}) -> {F(H,{seek,Key}),H};
|
|
|
- (F,{{ok,K,V},H}) when Dir =:= prev -> RangeCheckRun(F,K,V,H); % first move
|
|
|
- (F,{{ok,K,V},H}) -> Run(F,K,H,V,[]); % first move
|
|
|
- (F,{{ok,K,V},H,A}) -> Run(F,K,H,V,A); % CPS continuator
|
|
|
- (_,{{error,_},H,Acc}) -> {{ok,[],[]},H,Acc};
|
|
|
- (F,{R,O}) -> F(R,O);
|
|
|
+ It = fun(F,{ok,H}) -> {F(H,{seek,Key}),H}; % first move (seek)
|
|
|
+ (F,{{ok,K,V},H}) when Dir =:= prev -> RangeCheckRun(F,K,V,H); % first chained prev-take
|
|
|
+ (F,{{ok,K,V},H}) -> Run(F,K,H,V,[]); % first chained next-take
|
|
|
+ (F,{{ok,K,V},H,A}) -> Run(F,K,H,V,A); % chained CPS-take continuator
|
|
|
+ (_,{{error,_},H,Acc}) -> {{ok,[],[]},H,Acc}; % error effects
|
|
|
+ (F,{R,O}) -> F(R,O); % chain constructor
|
|
|
(F,H) -> F(H) end,
|
|
|
|
|
|
catch case lists:foldl(It, {ref(),[]}, Fx) of
|