Namdak Tonpa 7 years ago
parent
commit
94531caeca
4 changed files with 49 additions and 35 deletions
  1. 1 1
      include/kvs.hrl
  2. 46 33
      man/kvs_stream.htm
  3. 1 0
      src/kvs.erl
  4. 1 1
      src/kvs_stream.erl

+ 1 - 1
include/kvs.hrl

@@ -7,7 +7,7 @@
               dir=   0 ::  0 | 1,
               reader=  [] :: [] | tuple(),
               writer=  [] :: [] | tuple()).
--record(cur,  {?CUR, left=0, right=0, args=[]::list(tuple()|integer()), money=0, status}).
+-record(cur,  {?CUR, left=0, right=0, args=[]::list(tuple()|integer()), money=0, status=[]}).
 
 -define(ITER, id=   [] :: term(),
               next= [] :: [] | integer(),

+ 46 - 33
man/kvs_stream.htm

@@ -124,21 +124,23 @@
  -include_lib("kvs/include/user.hrl").
  -compile(export_all).
 
+ set(X,Y,Z) -> setelement(X,Z,Y).
+
  check() ->
      Cur = kvs_stream:new(),
-     [A,B,C,D] = [ kvs:next_id(person,1)
+     [A,B,C,D] = [ kvs:seq(person,1)
               || _ <- lists:seq(1,4) ],
      R = kvs_stream:save(
-         kvs_stream:add(#person{id=A},
-         kvs_stream:add(#person{id=B},
-         kvs_stream:add(#person{id=C},
-         kvs_stream:add(#person{id=D}, Cur ))))),
-     X = kvs_stream:take(-1,
+         kvs_stream:add(set(#cur.args,#person{id=A},
+         kvs_stream:add(set(#cur.args,#person{id=B},
+         kvs_stream:add(set(#cur.args,#person{id=C},
+         kvs_stream:add(set(#cur.args,#person{id=D}, Cur ))))))))),
+     X = kvs_stream:take(
          kvs_stream:down(
-         kvs_stream:top(R))),
-     Y = kvs_stream:take(-1,
+         kvs_stream:top(R#cur{args=-1}))),
+     Y = kvs_stream:take(
          kvs_stream:up(
-         kvs_stream:bot(R))),
+         kvs_stream:bot(R#cur{args=-1}))),
      X = lists:reverse(Y),
      L = length(X).
 
@@ -148,8 +150,8 @@
  > kvs:all(cur).
  [{cur,1,{user2,1,3,[],[],[],[],[],[]},0,1,2}]
 
- > kvs_stream:take(-1,
-   kvs_stream:top(kvs:get(cur,1))).
+ > kvs_stream:take(
+   kvs_stream:top((kvs:get(cur,1))#cur{args=-1})).
 [{user2,2,[],4,[],[],[],[],[]},
  {user2,4,2,3,[],[],[],[],[]},
  {user2,3,4,1,[],[],[],[],[]},
@@ -172,11 +174,11 @@
 
 <figure><code>
  > kvs_stream:new().
- {cur,1,[],0,[],[]}
+ {cur,1,[],[],0,[],[],0,0,[],0,[]}
  > kvs:get(id_seq,"cur").
  {ok,{id_seq,"cur",1}}
  > kvs_stream:new().
- {cur,2,[],0,[],[]}
+ {cur,2,[],[],0,[],[],0,0,[],0,[]}
  > kvs:get(id_seq,"cur").
  {ok,{id_seq,"cur",2}}
 
@@ -191,9 +193,9 @@
  > kvs:all(cur).
  []
  > kvs_stream:save(kvs_stream:new()).
- {cur,3,[],0,[],[]}
+ {cur,3,[],[],0,[],[],0,0,[],0,[]}
  > kvs:all(cur).
- [{cur,3,[],0,[],[]}]
+ [{cur,3,[],[],0,[],[],0,0,[],0,[]}]
 
 </code></figure>
 
@@ -204,12 +206,12 @@
 
 <figure><code>
   > S = 3, kvs_stream:load(S).
-  {cur,3,[],[],0,[]}
+  {cur,3,[],[],0,[],[],0,0,[],0,[]}
 
 </code></figure>
 
 <a name=add></a>
-<h4>add(Object::tuple(),#cur{}) -> #cur{}.</h4>
+<h4>add(#cur{args::tuple()}) -> #cur{}.</h4>
 
 <p>Adds any object to datatabase and update writer cursor.
    Object is linked on next prev fields with existed data under cursor.
@@ -221,11 +223,11 @@
  [block,container,cur,id_seq,iter,iterator,kvs,log,operation]
 
  > P = {user2,[],[],[],[],[],[],[],[]},
-   kvs_stream:save(kvs_stream:add(P,kvs_stream:load(S))).
+   kvs_stream:save(kvs_stream:add((kvs_stream:load(S))#cur{args=P})).
  #cur{id = 3,top = 1,bot = 1,dir = 0,
       reader = {user2,1,[],[],[],[],[],[],[]},
       writer = {user2,1,[],[],[],[],[],[],[]},
-      left = 0,right = 0}
+      left = 0,right = 0,args = [],money = 0,status = []}
 
 </code></figure>
 
@@ -249,11 +251,11 @@
 
 <figure><code>
  > kvs_stream:next(kvs_stream:top(
-   kvs_stream:save(kvs_stream:add(P,kvs_stream:load(S))))).
+   kvs_stream:save(kvs_stream:add((kvs_stream:load(S))#cur{args=P})))).
   #cur{id = 3,top = 2,bot = 1,dir = 1,
       reader = {user2,1,[],2,[],[],[],[],[]},
       writer = {user2,2,1,[],[],[],[],[],[]},
-      left = 0,right = 1}
+      left = 0,right = 1,args = [],money = 0,status = []}
 
 </code></figure>
 
@@ -264,12 +266,12 @@
    If cursor has no cached value then function returns error.</p>
 
 <figure><code>
- > Stream = kvs_stream:save(kvs_stream:add(P,kvs_stream:load(S))),
+ > Stream = kvs_stream:save(kvs_stream:add((kvs_stream:load(S))#cur{args=P})),
    kvs_stream:seek(kvs_stream:up(Stream)).
  #cur{id = 3,top = 3,bot = 1,dir = 0,
       reader = {user2,1,[],2,[],[],[],[],[]},
       writer = {user2,3,2,[],[],[],[],[],[]},
-      left = 2,right = 0}
+      left = 2,right = 0,args = [],money = 0,status = []}
 
 </code></figure>
 
@@ -283,7 +285,7 @@
  #cur{id = 3,top = 3,bot = 1,dir = 1,
      reader = {user2,3,2,[],[],[],[],[],[]},
      writer = {user2,3,2,[],[],[],[],[],[]},
-     left = 2,right = 0}
+     left = 2,right = 0,args = [],money = 0,status = []}
 
 </code></figure>
 
@@ -297,7 +299,7 @@
  #cur{id = 3,top = 3,bot = 1,dir = 0,
       reader = {user2,1,[],2,[],[],[],[],[]},
       writer = {user2,3,2,[],[],[],[],[],[]},
-      left = 2,right = 0}
+      left = 2,right = 0,args = [],money = 0,status = []}
 
 </code></figure>
 
@@ -308,10 +310,15 @@
    Returns consumed data. Usually you seek to some position and then consume some data.</p>
 
 <figure><code>
- > kvs_stream:take(-1,kvs_stream:load(S)).
- [{user2,3,2,[],[],[],[],[],[]},
-  {user2,2,1,3,[],[],[],[],[]},
-  {user2,1,[],2,[],[],[],[],[]}]
+ > kvs_stream:take((kvs_stream:load(S))#cur{args=-1}).
+ #cur{id = 3,top = 3,bot = 1,dir = 0,
+      reader = {user2,1,[],2,[],[],[],[],[]},
+      writer = {user2,3,2,[],[],[],[],[],[]},
+      left = 2,right = 0,
+      args = [{user2,3,2,[],[],[],[],[],[]},
+              {user2,2,1,3,[],[],[],[],[]},
+              {user2,1,[],2,[],[],[],[],[]}],
+      money = 0,status = []}
 
 </code></figure>
 
@@ -348,10 +355,16 @@
    Please do not use remove, keep your data immutable :-)</p>
 
 <figure><code>
- > kvs_stream:take(-1,kvs_stream:top(kvs_stream:save(
-   kvs_stream:remove(Stream#cur.top-1,kvs_stream:load(S))))).
- [{user2,1,[],3,[],[],[],[],[]},
-  {user2,3,1,[],[],[],[],[],[]}]
+ > kvs_stream:take((kvs_stream:top(kvs_stream:save(
+   kvs_stream:remove((kvs_stream:load(S))#cur{args=
+   Stream#cur.top-1}))))#cur{args=-1}).
+ #cur{id = 3,top = 3,bot = 1,dir = 1,
+      reader = {user2,3,1,[],[],[],[],[],[]},
+      writer = {user2,1,[],3,[],[],[],[],[]},
+      left = 1,right = 0,
+      args = [{user2,1,[],3,[],[],[],[],[]},
+              {user2,3,1,[],[],[],[],[],[]}],
+      money = 0,status = []}
 
 </code></figure>
 

+ 1 - 0
src/kvs.erl

@@ -32,6 +32,7 @@ stop()             -> stop    (#kvs{mod=?DBA}).
 destroy()          -> destroy (#kvs{mod=?DBA}).
 version()          -> version (#kvs{mod=?DBA}).
 dir()              -> dir     (#kvs{mod=?DBA}).
+seq(Table,DX) -> next_id(Table,DX).
 next_id(Table,DX)  -> next_id(Table, DX, #kvs{mod=?DBA}).
 
 generation(Table,Key) ->

+ 1 - 1
src/kvs_stream.erl

@@ -96,7 +96,7 @@ seek(#cur{top=T,bot=B,left=L,right=R,dir=1,reader=P}=C) ->
 % new, save, load, up, down, top, bot
 
 new   () -> #cur{id=kvs:next_id(cur,1)}.
-save (C) -> kvs:put(C), C.
+save (C) -> NC = C#cur{args=[]}, kvs:put(NC), NC.
 load (K) -> case kvs:get(cur,K) of {ok,C} -> C; E -> E end.
 up   (C) -> C#cur{dir=0}.
 down (C) -> C#cur{dir=1}.