Ленивые списки
11/11/2011 10:09
Хотел бы поделиться библиотечкой по ленивым спискам: https://github.com/vjache/erlang-zlists
В качестве примеров, где они могли бы использоваться:
- Допустим вы разрабатываете API доступа к неким данным. Данные обычно возвращаются как списки неких объектов(записей). Если возвращаемые списки должны быть большими то это превращается в проблему. Зачастую появляются две разновидности функций, т.н. легковесные(для получения маленьких результатов) и балковые (для получения больших результатов). При этом клиентский код должен поддерживать два типа источника данных, списки для малых результатов и нечто для больших результатов. Во втором случае, обычно используется паттерн continuation(см. например disk_log).
Так вот чтобы не изгаляться, можно сделать одну API функцию возвращающую zlist. Для коротких результатов всё будет скорей всего возвращено в N головных элементах(это можно регулировать параметром запроса), но если не вписался, то остальное будет дозапрошено в хвостовой функции.- zlist можно использовать ИМХО для написания парсеров больших данных. Дело в том что, я мог бы реализовать ленивую коллекцию не как improper list, а как что то не прозрачное (тупль, рекорд) с функцией next(), но я решил сохранить одно из свойств списка - это возможность паттерн мэтчинга N головных элементов.
