kvs_stream.htm 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <meta name="description" content="" />
  8. <meta name="author" content="Maxim Sokhatsky" />
  9. <title>STREAM</title>
  10. <link rel="stylesheet" href="https://synrc.space/synrc.css" />
  11. </head>
  12. <body>
  13. <nav>
  14. <a href='https://n2o.dev'>DEV</a>
  15. <a href='https://kvs.n2o.space'>KVS</a>
  16. <a href='#' style="background:#ededed;">STREAM</a>
  17. </nav>
  18. <header>
  19. <a href="../index.html"><img src="https://n2o.space/img/Synrc Neo.svg"></a>
  20. <h1>STREAM</h1>
  21. </header>
  22. <main>
  23. <section>
  24. <h3>INTRO</h3>
  25. <p>The STREAM module provides chain accumulation, traversal and persistence.
  26. </p>
  27. <p><blockquote><p><ul>
  28. <li><b><a href="#writer">writer/1</a></b> &mdash; creates writer cursor to db.</li>
  29. <li><b><a href="#reader">reader/1</a></b> &mdash; creates reader cursor to db.</li>
  30. <li><b><a href="#save">save/1</a></b> &mdash; stores cursor to db.</li>
  31. <li><b><a href="#load">load_reader/1</a></b> &mdash; loads reader cursor.</li>
  32. <li><b><a href="#load">load_writer/1</a></b> &mdash; loads writer cursor.</li>
  33. <li><b><a href="#top">top/1</a></b> &mdash; returns top of the chain.</li>
  34. <li><b><a href="#bot">bot/1</a></b> &mdash; returns bottom of the chain.</li>
  35. <li><b><a href="#next">next/1</a></b> &mdash; moves reader next.</li>
  36. <li><b><a href="#prev">prev/1</a></b> &mdash; moves reader prev.</li>
  37. <li><b><a href="#take">take/1</a></b> &mdash; takes N elements from reader.</li>
  38. <li><b><a href="#drop">drop/1</a></b> &mdash; skips N elements from reader.</li>
  39. <li><b><a href="#add">add/1</a></b> &mdash; adds element to list.</li>
  40. <li><b><a href="#append">append/2</a></b> &mdash; adds element to feed.</li>
  41. <li><b><a href="#append">cut/2</a></b> &mdash; cleanup feed by a given timestamp.</li>
  42. </ul></p></blockquote></p>
  43. <p>
  44. You can grab <a style="margin-bottom:30px;"
  45. href="https://raw.githubusercontent.com/synrc/kvs/master/src/kvs_stream.erl">kvs_stream</a>
  46. and use it in your applications without importing <b>synrc/kvs</b> dependency,
  47. as this module is self-containing.
  48. The possible applications are: public and private feeds, FIFO queues,
  49. unread messages, chat applications, blockchain etc.<br><br>
  50. </section>
  51. <section>
  52. <h3>WRITER</h3>
  53. <p>Writer cursor represents append list chain with some cached values.
  54. E.g., chain size, first element of the chain, cached value of
  55. previous written message and field for passing arguments for stream functions, like add.</p>
  56. <figure><code>
  57. -record(writer, { id = [] :: term(),
  58. count = 0 :: integer(),
  59. cache = [] :: [] | tuple(),
  60. args = [] :: term(),
  61. first = [] :: [] | tuple() } ).
  62. </code></figure>
  63. <p>For adding data to database you need first create writer cursor,
  64. set the args field with record from metainfo and call save function.</p>
  65. <h4>writer(term()) -> #writer{}.</h4>
  66. <p>Creates writer cursor.</p>
  67. <h4>add(#writer{}) -> #writer{}.</h4>
  68. <p>Adds element to list declared by writer cursor.</p>
  69. <h4>load_writer(#writer{}) -> #writer{}.</h4>
  70. <p>Loads writer cursor.</p>
  71. <h4>save(#writer{}) -> #writer{}.</h4>
  72. <p>Flushes writer cursor to database.</p>
  73. </section>
  74. <section>
  75. <h3>READER</h3>
  76. <figure><figcaption>Reader Cursor</figcaption><code>
  77. -record(reader, { id = [] :: integer(),
  78. pos = 0 :: [] | integer(),
  79. cache = [] :: [] | integer(),
  80. args = [] :: term(),
  81. feed = [] :: term(),
  82. dir = 0 :: 0 | 1 } ).
  83. </code></figure>
  84. <h4>reader(integer()) -> #reader{}.</h4>
  85. <p>Creates reader cursor.</p>
  86. <h4>load_reader(#reader{}) -> #reader{}.</h4>
  87. <p>Loads reader cursor from database.</p>
  88. <h4>save(#reader{}) -> #reader{}.</h4>
  89. <p>Flushes cursor to database.</p>
  90. <h4>top(#reader{}) -> #reader{}.</h4>
  91. <p>Moves cursor to top of the list.</p>
  92. <h4>bot(#reader{}) -> #reader{}.</h4>
  93. <p>Moves cursor to bottom of the list.</p>
  94. </section>
  95. <section>
  96. <h3>ITER</h3>
  97. <figure><figcaption>KVS Stream Iterator</figcaption><code>
  98. -record(iter, { id = [] :: [] | integer(),
  99. next = [] :: [] | integer(),
  100. prev = [] :: [] | integer() } ).
  101. </code></figure>
  102. <h4>next(#reader{}) -> #reader{}.</h4>
  103. <p>Moves cursor to next. Consume data down from top.
  104. Return error if list is empty, otherwise next element or last.</p>
  105. <h4>prev(#reader{}) -> #reader{}.</h4>
  106. <p>Moves cursor to prev. Consume data up from bottom.
  107. Return error if list is empty, otherwise next element or last.</p>
  108. <h4>drop(#reader{}) -> #reader{}.</h4>
  109. <p>Drops N elements starting from reader.</p>
  110. <h4>take(#reader{}) -> #reader{}.</h4>
  111. <p>Trying to consume N records from stream using its current value and direction.
  112. Returns consumed data. Usually you seek to some position and then consume some data.</p>
  113. </section>
  114. <section>
  115. <p>This module may refer to:
  116. <a href="kvs.htm"><b>kvs</b></a>,
  117. <a href="kvs_st.htm"><b>kvs_st</b></a>.
  118. </p>
  119. </section>
  120. </main>
  121. <footer>
  122. 2005&mdash;2019 &copy; Synrc Research Center
  123. </footer>
  124. </body>
  125. </html>