All streams
Search
Write a publication
Pull to refresh
36
0
Роман @Pozadi

User

Send message
image
В этом что-то есть :)
Я не про вернуть, просто файлик всё еще на гитхабе (хоть бы и по той же ссылке выше). Кстати ссылка на сам коммит, кажется, будет работать даже если коммит удалить из истории :)

Нужно репозиторий удалять.
В истории всё равно остался текст, нужно отредактировать историю и сделать форс пуш.
Походу, все наши примеры использования Reduced были некорректными
Наверно вы правы. Спасибо!
Дописал дополнение к статье. Т.е. теперь можно делать take+append и всё будет работать!
Вообще подумалось, что step() и step(result) тоже должны иметь право возвращать Reduced, но у Рича это явно не так для step(), и не понятно для step(result).

image

Наверно нужно уже в исходники кложуры лезть чтобы разобраться.
Дописал пример с поддержкой обоих типов завершения, и с начальным вызовом заодно. (не проверял)

function Stream(transducer, onValue, onEnd) {
  this._onEnd = onEnd;
  this._closed = false;
  this._step = transducer(function(result, item) {
    if (arguments.length === 2) {  onValue(item)  }
  });
  this._step();
}

Stream.prototype.push = function(x) {
  if (!this._closed) {
    if (isReduced(this._step(null, x)) {
      this._closed = true;
      this._onEnd();
    }
  }
}

Stream.prototype.close = function() {
  if (!this._closed) {
    this._step(null);
    this._closed = true;
    this._onEnd();
  }
}
Да, это, видимо, трасдьюсеры не могут.

Но в FRP ничего не потеряется, там Reduced всплывет, и мы узнаем что нужно закрывать поток.
В первом примере всё правильно. Если стоит take(3), то должно вернуться 3 элемента не больше. Представьте как это было бы если бы мы постаринке делали с временными коллекциями.

По поводу второго есть в посте:
Еще придется добавлять проверку Reduced.isReduced(result) в трансдьюсеры, которые несколько раз вызывают step (прим. flatten).
При преждевременном завершении обычного завершения уже не будет.
Да, step() без параметров вызывается только 1 раз — вначале. Он вызывается во внешенм коде, сами трансдьюсеры не должны его вызывать (только если их самих вызвали без параметров).

Тоже самое и для step() с одним параметром, его можно, и нужно, вызывать только если ваш step вызвали с одним параметром.
Точнее в примере с потоком уже используется `undefined`. Там все step функции всегда возвращают `undefined`. Я даже и не заметил :)
Добалю к тому что написал mayorovp.

Резервировать undefined всё таки неправильно, посмотрите мой пример с потоком habrahabr.ru/post/237733/#comment_7998887, я там использую null (потому что результат никуда сохранять не нужно), но кто-то может захотеть использовать undefined, и я считаю он имеет полное право использовать undefined.

Также, мне сейчас не хочется думать какие еще могут возникнуть проблемы (кроме того, что обрабатываем на один элемент больше), но у меня есть сильное предчувствие, что это даст нам еще какие-то ограничения.

Думаю идеальным было бы сделать такой редьюсд `{__transducersReduced__: true, wrapped: result}`, тогда мы наложим минимум ограничений, и избавимся от привязки к конкретной библиотеке.
Я бы не начинал всё направо и налево называть трансдьюсерами :) Всё-таки у них есть пока-что четкая спецификация. Просто именно так мы отдаляемся от светлого будущего, в котором многие библиотеки будут поддерживать трансдьюсеры как протокол и смогут друг с другом тесно взаимодействовать через этот протокол.
Как-то так

function Stream(transducer, subscriber) {
  this._step = transducer(function(result, item) {
    if (arguments.length === 2) {  subscriber(item)  }
  });
}

Stream.prototype.push = function(x) {
  this._step(null, x);
}

stream = new Stream(first5T, function(x) {  console.log('>>', x)  });
stream.push(1);
stream.push(2);
stream.push(3);
stream.push(4);
stream.push(5);
stream.push(6);
stream.push(7);
Да, точно. Спасибо!
Мы с вами в одинаковом положении потому что я с генераторами очень мало знаком пока :)
Подозреваю что многое из этого всего можно сделать на генераторах, да.
Проверил, вроде всё правильно.
Можем и ждать, завершение потока может что-то значить в FRP иногда.
Мы тогда на один элемент больше обработаем, а в FRP, например, это может быть важно (позже по времени завершится поток).

И может где-то что-то еще не сойдется, сейчас не приходит в голову.

Information

Rating
Does not participate
Location
Россия
Date of birth
Registered
Activity