Browse Source

traverse API via fold

Andrii Zadorozhnii 8 years ago
parent
commit
63843be1f0
2 changed files with 16 additions and 12 deletions
  1. 13 0
      README.md
  2. 3 12
      src/kvs.erl

+ 13 - 0
README.md

@@ -214,6 +214,19 @@ Read flat values by all keys from table:
  #user{id="dox@ua.fm"}]
  #user{id="dox@ua.fm"}]
 ```
 ```
 
 
+Table can be traversed from any element in any directions with ```fold/6``` processing function.
+
+Function ```entries/3``` which read the elements from top of container can be implemented by reversing the ```fold/6``` result list:
+
+```erlang
+4> {ok,F2} = kvs:get(feed,"f").
+{ok,{feed,"f",2,2,aclver}}
+
+5> lists:reverse(kvs:fold(fun(A,Acc)->[A|Acc] end, [], entry, element(#container.top, F2),2,#iterator.prev)).
+[#entry{id = 2,container = feed,feed_id = "f",prev = 1, next = [],...},
+ #entry{id = 1,container = feed,feed_id = "f",prev = [], next = 2,...}]
+ ```
+
 Containers
 Containers
 ----------
 ----------
 
 

+ 3 - 12
src/kvs.erl

@@ -26,7 +26,6 @@ put(Record)        -> put     (Record, #kvs{mod=?DBA}).
 link(Record)       -> link    (Record, #kvs{mod=?DBA}).
 link(Record)       -> link    (Record, #kvs{mod=?DBA}).
 unlink(Record)     -> unlink  (Record, #kvs{mod=?DBA}).
 unlink(Record)     -> unlink  (Record, #kvs{mod=?DBA}).
 fold(Fun,Acc,T,S,C,D) -> fold (Fun,Acc,T,S,C,D, #kvs{mod=?DBA}).
 fold(Fun,Acc,T,S,C,D) -> fold (Fun,Acc,T,S,C,D, #kvs{mod=?DBA}).
-traversal(T,S,C,D) -> traversal(T,S,C,D, #kvs{mod=?DBA}).
 info(T)            -> info    (T, #kvs{mod=?DBA}).
 info(T)            -> info    (T, #kvs{mod=?DBA}).
 start()            -> start   (#kvs{mod=?DBA}).
 start()            -> start   (#kvs{mod=?DBA}).
 stop()             -> stop    (#kvs{mod=?DBA}).
 stop()             -> stop    (#kvs{mod=?DBA}).
@@ -227,11 +226,6 @@ do_remove(E,#kvs{mod=Mod}=Driver) ->
     kvs:info(?MODULE,"Delete: ~p", [E]),
     kvs:info(?MODULE,"Delete: ~p", [E]),
     kvs:delete(element(1,E),element(2,E), Driver).
     kvs:delete(element(1,E),element(2,E), Driver).
 
 
-traversal(Table, Start, Count, Direction, Driver)->
-    fold(fun(A,Acc) -> [A|Acc] end,[],Table,Start,Count,Direction,Driver).
-
-% kvs:fold(fun(X,A)->[X|A]end,[],process,2152,-1,#iterator.next,#kvs{mod=store_mnesia}).
-
 fold(___,Acc,_,[],_,_,_) -> Acc;
 fold(___,Acc,_,[],_,_,_) -> Acc;
 fold(___,Acc,_,undefined,_,_,_) -> Acc;
 fold(___,Acc,_,undefined,_,_,_) -> Acc;
 fold(___,Acc,_,_,0,_,_) -> Acc;
 fold(___,Acc,_,_,0,_,_) -> Acc;
@@ -246,12 +240,9 @@ fold(Fun,Acc,Table,Start,Count,Direction,Driver) ->
                     Acc end catch _:_ -> Acc end.
                     Acc end catch _:_ -> Acc end.
 
 
 entries({error,_},_,_,_)      -> [];
 entries({error,_},_,_,_)      -> [];
-entries({ok,Container},N,C,Driver) -> entries(Container,N,C,Driver);
-entries(T,N,C,Driver)              -> traversal(N,element(#container.top,T),C,#iterator.prev,Driver).
-entries(N, Start, Count, Direction, Driver) ->
-    E = traversal(N, Start, Count, Direction, Driver),
-    case Direction of #iterator.next -> lists:reverse(E);
-                      #iterator.prev -> E end.
+entries({ok,T},N,C,Driver) ->
+    lists:reverse(fold(fun(A,Acc) -> [A|Acc] end,[],N,element(#container.top,T),C,#iterator.prev,Driver)).
+    
 
 
 add_seq_ids() ->
 add_seq_ids() ->
     Init = fun(Key) ->
     Init = fun(Key) ->