Commits

Anonymous committed 061786c

streams

Comments (0)

Files changed (1)

   (Кроме того, редко используются операторы для собственно "bind",
 а не для "bind_rev"; это "=<<" для монады итератов и "%<<" для базовой
 монады.)
+
+
+Итераты: потоки.
+
+  Каждый итерат обрабатывает поток входящих данных, которые ему передаёт
+энумератор.
+
+  Итерату последовательно передаются элементы потока, и код итерата
+определяет то, возвратит ли итерат результат обработки и опционально
+часть необработанного потока, или запросит следующий элемент потока.
+
+  Поток может закончиться либо естественным образом (конец файла, закрытый
+сокет), либо с ошибкой.  Если поток не закончился, элемент потока содержит
+данные, которые будут обработаны данным итератом (возможно, частично).
+
+  В ocaml-iteratees поток представлен типом данных
+
+    type stream 'a =
+      [ EOF of option err_msg
+      | Chunk of Subarray.t 'a
+      ]
+    ;
+
+  Тип err_msg назван так исторически, в ocaml-iteratees представлен
+типом exn.
+
+  Данные хранятся в так называемых "подмассивах".  Подмассив -- это запись,
+содержащая ссылку на сам массив с данными, начальное смещение данных в этом
+массиве и длину данных.  Они и логика работы с ними описана в
+модуле Subarray (файл subarray.ml).
+
+- почему не списки?
+  Для эффективности операций, работающих с чанками, например, тех,
+  которые берут какие-то части чанка, а не просто последовательно идут
+  по нему (например, для операции, возвращающих последовательность
+  первых n элементов).  В случае списков этого нельзя достичь иначе,
+  чем через копирование части списка.
+
+- почему не строки?
+  Потому что итераты в целом полиморфны, если не указано иного.  Они
+  могут обрабатывать чанки с элементами любых типов, и в этом их
+  большой плюс.
+
+- почему изменяемые массивы это безопасно?
+  Потому что:
+  1. чанки рождаются только в энумераторах (в том числе в энумератах),
+  2. у каждого энумератора есть свой массив, и вложенные итераты
+     по правилам хорошего тона должны только читать этот массив и не
+     модифицировать его (хотя это и допустимо в некоторых случаях,
+     если представляете последствия).  Пока все соблюдают правила
+     хорошего тона, всё безопасно.
+
+  Однако автор этого документа думал про представление данных в виде
+типа "либо подстрока, либо подмассив" с выбором нужных функций для работы
+с чанком в рантайме, однако пока профайлер не показал необходимости
+этого.  (может, у вас покажет?)