ВСТУП
Модуль STREAM пропонує інтерфейс фолдів, акумуляторів за персистентного зберігання ланцюжків даних.
- writer/1 — створює та повертає курсор запису до бази даних.
- reader/1 — створює та повертає курсор зчитування до бази даних.
- save/1 — зберігає курсор до бази даних.
- load_reader/1 — підзавантажує збережений курсор зчитування.
- load_writer/1 — підзавантажує збережений курсор запису.
- top/1 — повертає початок (вершину) ланцюжка.
- bot/1 — повертає закінчення (основу) ланцюжка.
- next/1 — переміщає курсор зчитування на наступний елемент.
- prev/1 — переміщає курсор зчитування на попередній елемент.
- take/1 — повертає N елементів з курсору зчитування.
- drop/1 — пропускає N елементів з курсору зчитування.
- add/1 — додає елемент до списку.
- append/2 — додає елемент в канал.
- cut/2 — очищає канал до заданої мітки timestamp.
Ви може взяти kvs_stream
і використовувати у своїх додатках без імпортування залежності synrc/kvs,
оскільки даний модуль є самодостатнім.
Додатками можуть бути: публічні та приватні канали/стрічки новин, FIFO черги,
непрочитані повідомлення, чат, блокчейн etc.
WRITER
Курсор запису передставляє собою додавання деяких кешованих значень до списку-ланцюжка. Наприклад, розмір ланцюжка, перший елемент ланцюжка, кешоване значення попереднього записаного повідомлення, та поле для передачі аргументів stream функціям, таким, як add.
-record(writer, { id = [] :: term(),
count = 0 :: integer(),
cache = [] :: [] | tuple(),
args = [] :: term(),
first = [] :: [] | tuple() } ).
Щоб додати дані до бази даних, спочатку потрібно створити курсор запису, встановити запис з мета-інформацією в поле аргументів, та викликати функцію save.
writer(term()) -> #writer{}.
Створює курсор запису.
add(#writer{}) -> #writer{}.
Додає елемент до списку, на який вказує курсор запису.
load_writer(#writer{}) -> #writer{}.
Підзавантажує курсор запису.
save(#writer{}) -> #writer{}.
Переміщує курсор запису до бази даних.
READER
-record(reader, { id = [] :: integer(),
pos = 0 :: [] | integer(),
cache = [] :: [] | integer(),
args = [] :: term(),
feed = [] :: term(),
dir = 0 :: 0 | 1 } ).
reader(integer()) -> #reader{}.
Створює курсор зчитування.
load_reader(#reader{}) -> #reader{}.
Підзавантажує курсор зчитування з бази даних.
save(#reader{}) -> #reader{}.
Переміщує курсор зчитування до бази даних.
top(#reader{}) -> #reader{}.
Переміщає курсор в початок (вершину) списку.
bot(#reader{}) -> #reader{}.
Переміщає курсор в закінчення (основу) списку.
ITER
-record(iter, { id = [] :: [] | integer(),
next = [] :: [] | integer(),
prev = [] :: [] | integer() } ).
next(#reader{}) -> #reader{}.
Переміщає курсор на наступний елемент. Споживає дані з вершини. Повертає помилку, якщо список є пустим, в іншому випадку — наступний чи останній елемент.
prev(#reader{}) -> #reader{}.
Переміщає курсор на попередній елемент. Споживає дані з основи. Повертає помилку, якщо список є пустим, в іншому випадку — наступний чи останній елемент.
drop(#reader{}) -> #reader{}.
Пропускає N елементів, розпочинаючи з курсора.
take(#reader{}) -> #reader{}.
Пробує споживати N записів зі stream, використовуючи його поточне значення та напрям. Повертає споживані дані. Зазвичай ви шукаєте певну позицію, і далі споживаєте деякі дані.