|
@@ -6,20 +6,23 @@
|
|
|
|
|
|
% PUBLIC
|
|
|
|
|
|
-new(T) -> #cur{feed=kvs:next_id(cur,1),tab=T}.
|
|
|
-top(#cur{top=[]}=C) -> C#cur{val=[]};
|
|
|
-top(#cur{top=T}=C) -> seek(T,C).
|
|
|
-bot(#cur{bot=[]}=C) -> C#cur{val=[]};
|
|
|
-bot(#cur{bot=B}=C) -> seek(B,C).
|
|
|
-take(N,#cur{dir=D}=C) -> take(D,N,C,[]).
|
|
|
-save(C) -> kvs:put(C), C.
|
|
|
-load(#cur{feed=K}) -> kvs:get(cur,K).
|
|
|
-
|
|
|
-seek(Id, #cur{tab=T}=C) -> {ok,R}=kvs:get(T,Id), C#cur{val=R}.
|
|
|
+new(T) -> #cur{feed=kvs:next_id(cur,1),tab=T}.
|
|
|
+top(#cur{top=[]}=C) -> C#cur{val=[]};
|
|
|
+top(#cur{top=T}=C) -> seek(T,C).
|
|
|
+bot(#cur{bot=[]}=C) -> C#cur{val=[]};
|
|
|
+bot(#cur{bot=B}=C) -> seek(B,C).
|
|
|
+save(#cur{}=C) -> kvs:put(C), C.
|
|
|
+load(#cur{feed=K}) -> kvs:get(cur,K).
|
|
|
next(#cur{tab=T,val=[]}=C) -> {error,[]};
|
|
|
next(#cur{tab=T,val=B}=C) -> lookup(kvs:get(T,en(B)),C).
|
|
|
prev(#cur{tab=T,val=[]}=C) -> {error,[]};
|
|
|
prev(#cur{tab=T,val=B}=C) -> lookup(kvs:get(T,ep(B)),C).
|
|
|
+take(N,#cur{dir=D}=C) -> take(D,N,C,[]).
|
|
|
+seek(Id, #cur{tab=T}=C) -> {ok,R}=kvs:get(T,Id), C#cur{val=R}.
|
|
|
+remove(Id, #cur{tab=M}=C) -> {ok,R}=kvs:get(M,Id),
|
|
|
+ join(M,Id,[fix(kvs:get(M,X))||X<-[ep(R),en(R)]],C).
|
|
|
+
|
|
|
+% PRIVATE
|
|
|
|
|
|
add(top,M,#cur{top=T,val=[]}=C) -> Id=id(M), N=sp(sn(M,T),[]), kvs:put(N), C#cur{val=N,bot=Id,top=Id};
|
|
|
add(bot,M,#cur{bot=B,val=[]}=C) -> Id=id(M), N=sn(sp(M,B),[]), kvs:put(N), C#cur{val=N,bot=Id,top=Id};
|
|
@@ -28,10 +31,6 @@ add(bot,M,#cur{bot=B, val=V}=C) when element(2,V) /=B -> add(bot, M, bot(C));
|
|
|
add(top,M,#cur{top=T, val=V}=C) -> Id=id(M), N=sp(sn(M,T),[]), kvs:put([N,sp(V,Id)]), C#cur{val=N,top=Id};
|
|
|
add(bot,M,#cur{bot=B, val=V}=C) -> Id=id(M), N=sn(sp(M,B),[]), kvs:put([N,sn(V,Id)]), C#cur{val=N,bot=Id}.
|
|
|
|
|
|
-remove(Id, #cur{tab=M}=C) ->
|
|
|
- {ok,R}=kvs:get(M,Id),
|
|
|
- join(M,Id,lists:map(fun(X)->fix(kvs:get(M,X))end,[ep(R),en(R)]),C).
|
|
|
-
|
|
|
join(T,I,[[],[]],C) -> kvs:delete(T,I), C#cur{top=[],bot=[],val=[]};
|
|
|
join(T,I,[[], R],C) -> N=sp(R,[]), kvs:put(N), kvs:delete(T,I), C#cur{top=id(N),val=N};
|
|
|
join(T,I,[L, []],C) -> N=sn(L,[]), kvs:put(N), kvs:delete(T,I), C#cur{bot=id(N),val=N};
|
|
@@ -59,6 +58,8 @@ take(_,_,{error,_},R) -> lists:flatten(R);
|
|
|
take(_,0,_,R) -> lists:flatten(R);
|
|
|
take(A,N,#cur{val=B}=C,R) -> take(A,N-1,?MODULE:A(C),[B|R]).
|
|
|
|
|
|
+% TESTS
|
|
|
+
|
|
|
check() -> test(), test2(), ok.
|
|
|
|
|
|
test2() ->
|