kvs_stream.htm 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <!DOCTYPE html><html><head><meta charset="utf-8" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  2. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  3. <meta name="description" content="" /><meta name="author" content="Maxim Sokhatsky" />
  4. <title>STREAM</title>
  5. <link rel="stylesheet" href="https://n2o.dev/blank.css" />
  6. <link rel="stylesheet" href="https://n2o.dev/zima.css" />
  7. </head><body><nav>
  8. <a href="https://n2o.dev">DEV</a>
  9. <a href="https://kvs.n2o.dev">KVS</a>
  10. <a href="#" style="background:#ededed;">STREAM</a>
  11. <div class="dropdown">
  12. <a onclick="drop()" class="dropbtn">EN</a>
  13. <div id="dropdown" class="dropdown-content">
  14. <a href="https://n2o.dev/deps/kvs/man/ua/kvs_stream.htm">UA</a>
  15. <a href="#">EN</a>
  16. </div>
  17. </div>
  18. </nav><header>
  19. <a href="../index.html"><img src="https://openmoji.org/data/color/svg/1F4BF.svg"/></a>
  20. <h1>STREAM</h1>
  21. </header>
  22. <main>
  23. <article>
  24. <section>
  25. <h3>INTRO</h3>
  26. <p>The STREAM module provides chain persistence, accumulation and traversal.</p>
  27. <blockquote>
  28. <ul><li><b><a href="#writer">writer/1</a></b> — creates writer cursor for chain.</li>
  29. <li><b><a href="#reader">reader/1</a></b> — creates reader cursor for chain.</li>
  30. <li><b><a href="#save">save/1</a></b> — stores cursor to db.</li>
  31. <li><b><a href="#load_reader">load_reader/1</a></b> — loads reader cursor.</li>
  32. <li><b><a href="#top">top/1</a></b> — returns top of the reader.</li>
  33. <li><b><a href="#bot">bot/1</a></b> — returns bottom of the reader.</li>
  34. <li><b><a href="#next">next/1</a></b> — moves reader next.</li>
  35. <li><b><a href="#prev">prev/1</a></b> — moves reader prev.</li>
  36. <li><b><a href="#take">take/1</a></b> — takes N elements from reader.</li>
  37. <li><b><a href="#drop">drop/1</a></b> — skips N elements from reader.</li>
  38. <li><b><a href="#add">add/1</a></b> — adds element to writer.</li>
  39. <li><b><a href="#append">append/2</a></b> — appends element to feed.</li>
  40. <li><b><a href="#append">remove/2</a></b> — removes element to feed.</li>
  41. <li><b><a href="#cut">cut/2</a></b> — cleans-up the feed up to the key.</li>
  42. </ul></blockquote>
  43. <p>You can grab <a style="margin-bottom:30px;" href="https://raw.githubusercontent.com/synrc/kvs/master/src/layers/kvs_stream.erl">kvs_stream</a>
  44. and use it in your applications without importing <b>synrc/kvs</b> dependency,
  45. as this module is self-containing.
  46. The possible applications are: public and private feeds, FIFO queues,
  47. unread messages, chat applications, blockchain etc.<br /><br /></p>
  48. </section>
  49. <section>
  50. <h3>WRITER</h3>
  51. <p>Writer cursor represents unique append list chain with some cached values.
  52. E.g., elements <b>count</b>, <b>first</b> element of the chain, <b>cache</b> field for value of
  53. a previous written message and <b>args</b> field for passing arguments in fixpoint style.</p>
  54. <figure><code> -record(writer, { id = [] :: term(),
  55. count = 0 :: integer(),
  56. cache = [] :: [] | tuple(),
  57. args = [] :: term(),
  58. first = [] :: [] | tuple() } ).</code></figure>
  59. <p>For adding data to storage you need to create writer cursor,
  60. set the <b>args</b> field with the record to be added:</p>
  61. <figure><code> > require KVS
  62. KVS
  63. > KVS.writer
  64. {:writer, [], 0, [], [], []}</code></figure>
  65. <h4 id="writer">writer(list()) -> #writer{}.</h4>
  66. <p>Creates writer cursor. After this you normally call <b>save</b> function for cursor persistence.
  67. As a parameter provide cursor name as a list.</p>
  68. <figure><code> > w = :kvs.writer '/cursors/cur1'
  69. {:writer, '/cursors/cur1', 0, [], [], []}</code></figure>
  70. <h4 id="save">save(#writer{}) -> #writer{}.</h4>
  71. <p>Flushes writer cursor to database.</p>
  72. <figure><code> > :kvs.save w
  73. {:writer, '/cursors/cur1', 0, [], [], []}
  74. > :kvs.get :writer, '/cursors/cur1'
  75. {:ok, {:writer, '/cursors/cur1', 0, [], [], []}}</code></figure>
  76. <h4 id="add">add(#writer{}) -> #writer{}.</h4>
  77. <p>Adds element to persistent chain declared by writer cursor.
  78. Adding elements to chain affects <b>count</b> field.</p>
  79. <figure><code> > :lists.map fn _ ->
  80. {:ok,w} = :kvs.get(:writer,'/cursors/cur1')
  81. :kvs.save(:kvs.add(KVS.writer(w, args: {:"$msg", [], [], [], [], []})))
  82. end, :lists.seq(1, 5)
  83. [
  84. {:writer, '/cursors/cur1', 1, {:"$msg", '1313544188019000'}, [], []},
  85. {:writer, '/cursors/cur1', 2, {:"$msg", '1313544189127000'}, [], []},
  86. {:writer, '/cursors/cur1', 3, {:"$msg", '1313544189869000'}, [], []},
  87. {:writer, '/cursors/cur1', 4, {:"$msg", '1313544190519000'}, [], []},
  88. {:writer, '/cursors/cur1', 5, {:"$msg", '1313544191134000'}, [], []}
  89. ]
  90. > :kvs.get :writer, '/cursors/cur1'
  91. {:ok,
  92. {:writer, '/cursors/cur1', 5, {:"$msg", '1314009332950000'}, [], []}}</code></figure>
  93. </section>
  94. <section>
  95. <h3>READER</h3>
  96. <p>Reader cursor represents a user reading pointer to the writer feed.
  97. Field <b>#reader.feed</b> is linked to <b>#writer.id</b>.
  98. The <b>pos</b> field represents current position in feed.
  99. Field <b>dir</b> is used for changing <b>take</b> and <b>drop</b> directions.</p>
  100. <figure><figcaption>Reader Cursor</figcaption>
  101. <code> -record(reader, { id = [] :: integer(),
  102. pos = 0 :: [] | integer(),
  103. cache = [] :: [] | integer(),
  104. args = [] :: term(),
  105. feed = [] :: term(),
  106. dir = 0 :: 0 | 1 } ).</code></figure>
  107. <h4 id="reader">reader(term()) -> #reader{}.</h4>
  108. <p>Creates reader cursor for a given writer id.</p>
  109. <h4 id="load_reader">load_reader(term()) -> #reader{}.</h4>
  110. <p>Loads reader cursor from database.</p>
  111. <h4 id="save">save(#reader{}) -> #reader{}.</h4>
  112. <p>Flushes reader cursor to database.</p>
  113. <h4 id="top">top(#reader{}) -> #reader{}.</h4>
  114. <p>Moves cursor to top of the list.</p>
  115. <h4 id="bot">bot(#reader{}) -> #reader{}.</h4>
  116. <p>Moves cursor to bottom of the list.</p>
  117. </section>
  118. <section>
  119. <h3>ITER</h3>
  120. <figure><figcaption>KVS Stream Iterator</figcaption>
  121. <code> -record(iter, { id = [] :: [] | integer(),
  122. next = [] :: [] | integer(),
  123. prev = [] :: [] | integer() } ).</code></figure>
  124. <h4 id="next">next(#reader{}) -> #reader{}.</h4>
  125. <p>Moves cursor to next. Consume data down from top.
  126. Return error if list is empty, otherwise next element or last.</p>
  127. <h4 id="prev">prev(#reader{}) -> #reader{}.</h4>
  128. <p>Moves cursor to prev. Consume data up from bottom.
  129. Return error if list is empty, otherwise next element or last.</p>
  130. <h4 id="drop">drop(#reader{}) -> #reader{}.</h4>
  131. <p>Drops N elements starting from reader.</p>
  132. <h4 id="take">take(#reader{}) -> #reader{}.</h4>
  133. <p>Trying to consume N records from stream using its current value and direction.
  134. Returns consumed data. Usually you seek to some position and then consume some data.</p>
  135. <h4 id="append">append(tuple(), list()) -> term().</h4>
  136. <p>Adds record to feed.</p>
  137. <h4 id="append">remove(tuple(), list()) -> term().</h4>
  138. <p>Removes record from feed.</p>
  139. <h4 id="cut">cut(list(), term()) -> #ok{} | #error{}.</h4>
  140. <p>Cuts the feed up to a given key.</p>
  141. </section>
  142. <section>
  143. <p>This module may refer to:
  144. <a href="kvs.htm"><b>kvs</b></a>,
  145. <a href="kvs_st.htm"><b>kvs_st</b></a>.
  146. </p>
  147. </section>
  148. </article>
  149. </main>
  150. <footer>2005—2019 © Synrc Research Center</footer>
  151. <script>function drop(){document.getElementById("dropdown").classList.toggle("show");}</script>
  152. </body>
  153. </html>