| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- 'use strict';
- const {Final, Many} = require('../index');
- const next = async (value, fns, index) => {
- for (let i = index; i <= fns.length; ++i) {
- if (value && typeof value.then == 'function') {
- // thenable
- value = await value;
- }
- if (value instanceof Final) {
- return value.value;
- }
- if (value instanceof Many) {
- if (i == fns.length) return value;
- const results = [],
- values = value.values;
- for (let j = 0; j < values.length; ++j) {
- const result = await next(values[j], fns, i);
- if (result instanceof Many) {
- results.push(...result.values);
- } else {
- results.push(result);
- }
- }
- return new Many(results);
- }
- if (value && typeof value.next == 'function') {
- // generator
- const results = [];
- for (;;) {
- let data = value.next();
- if (data && typeof data.then == 'function') {
- data = await data;
- }
- if (data.done) break;
- const result = await next(data.value, fns, i);
- if (result instanceof Many) {
- results.push(...result.values);
- } else {
- results.push(result);
- }
- }
- return new Many(results);
- }
- const fn = fns[i];
- if (!fn) break;
- value = fn(value);
- }
- return value;
- };
- const comp = (...fns) => {
- fns = fns.filter(fn => fn);
- if (!fns.length) return null;
- return async value => next(value, fns, 0);
- };
- module.exports = comp;
|