compose-iterator

1.2.0 • Public • Published

Compose Iterator

Use iterator for middleware composition.

Installation

$ npm install compose-iterator

Examples

compose.js

'use strict'
 
const Promise = require('any-promise')
 
const iterator = require('..')
 
/**
 * Expose compositor.
 */
 
module.exports = compose
 
/**
 * Compose `middleware` returning
 * a fully valid middleware comprised
 * of all those which are passed.
 *
 * @param {Array} middleware 
 * @return {Function} 
 * @api public
 */
 
function compose (middleware) {
  if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!')
  for (const fn of middleware) {
    if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')
  }
 
  /**
   * @param {Object} context 
   * @return {Promise} 
   * @api public
   */
 
  return function (context, next) {
    // iteration object
    const iter = iterator[Symbol.iterator](middleware, context, next)
 
    try {
      return Promise.resolve(iter.next().value)
    } catch (err) {
      return Promise.reject(err)
    }
  }
}

app.js

const co = require('co')
const compose = require('./compose')
 
function wait (ms) {
  return new Promise((resolve) => setTimeout(resolve, ms || 1))
}
 
var arr = []
var stack = []
 
stack.push(function * (context, next) {
  arr.push(1)
  yield wait(1)
  yield next()
  yield wait(1)
  arr.push(6)
})
 
stack.push(function * (context, next) {
  arr.push(2)
  yield wait(1)
  yield next()
  yield wait(1)
  arr.push(5)
})
 
stack.push(function * (context, next) {
  arr.push(3)
  yield wait(1)
  yield next()
  yield wait(1)
  arr.push(4)
})
 
compose(stack.map((fn) => co.wrap(fn)))({}).then(function () {
  console.log(arr.toString() === [1, 2, 3, 4, 5, 6].toString())
})

Badges

Build Status


fundon.me  ·  GitHub @fundon  ·  Twitter @_fundon

Package Sidebar

Install

npm i compose-iterator

Weekly Downloads

2

Version

1.2.0

License

MIT

Last publish

Collaborators

  • fundon