10#include "zen/config.hpp"
11#include "zen/error.hpp"
12#include "zen/maybe.hpp"
16template<
typename T,
typename Error = error>
20 virtual result<maybe<T>> get() = 0;
21 virtual result<maybe<T>> peek(std::size_t offset = 1) = 0;
23 virtual result<void> skip(std::size_t count = 1) {
24 for (std::size_t i = 0; i < count; i++) {
41 result<maybe<T>> get()
override {
46 if (!result->has_value()) {
47 return right(std::nullopt);
51 element = buffer.front();
54 return right(element);
57 result<maybe<T>> peek(std::size_t offset)
override {
58 while (buffer.size() < offset) {
61 if (!result->has_value()) {
62 return right(std::nullopt);
64 buffer.push_back(**result);
66 return right(buffer[offset-1]);
69 virtual result<maybe<T>> read() = 0;
73template<typename IterT, typename T = typename std::iterator_traits<IterT>::value_type>
74class iterator_stream :
public stream<T> {
86 iterator_stream(IterT begin, IterT end):
87 current(begin), end(end) {}
89 result<maybe<value_type>> get()
override {
91 return right(std::nullopt);
93 return right(*(current++));
96 result<maybe<value_type>> peek(std::size_t offset = 1)
override {
98 return right(std::nullopt);
100 return right(*current);
right_t< void > right()
Definition either.hpp:329
#define ZEN_TRY_DISCARD(expr)
The same as ZEN_TRY but the expression is immediately dropped.
Definition either.hpp:370
#define ZEN_TRY(value)
Return a left-valued immediately so only a right-valued either type remains.
Definition either.hpp:364