all files / src/ index.js

94.34% Statements 50/53
92.11% Branches 35/38
100% Functions 11/11
93.88% Lines 46/49
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84                16× 11×                             14× 14×           14×             14×          
import type from './type'
let Promise = null
 
function series (arr, inData) {
  if (type(arr) !== 'array') I{
    return Promise.resolve(null)
  }
 
  if (arr.length === 0) {
    return Promise.resolve(null)
  }
 
  return arr.reduce((promise, item) => {
    if (type(item) === 'function') {
      return promise.then(item)
    } else if (item && item.then && type(item.then) === 'function') {
      return promise.then(() => {
        return item
      })
    } else if (type(item) === 'array') {
      return promise.then(data => {
        return series(item, data)
      })
    } else if (type(item) === 'object') {
      return promise.then(data => {
        return parallel(item, data)
      })
    }
 
    return Promise.resolve(null)
  }, Promise.resolve(inData))
}
 
function parallel (obj, inData) {
  if (type(obj) !== 'object') I{
    return Promise.resolve(null)
  }
 
  const keys = Object.keys(obj)
  if (keys.length === 0) {
    return Promise.resolve(null)
  }
 
  const arr = keys.map(key => {
    const item = obj[key]
    if (type(item) === 'function') {
      return item(inData)
    } else if (item && item.then && type(item.then) === 'function') {
      return item
    } else if (type(item) === 'array') {
      return series(item, inData)
    } else if (type(item) === 'object') {
      return parallel(item, inData)
    }
 
    return Promise.resolve(null)
  })
 
  return Promise.all(arr)
    .then(data => {
      const ret = {}
      keys.forEach((key, i) => {
        ret[key] = data[i]
      })
      return ret
    })
}
 
export default function flowFactory (promise) {
  if (!promise) I{
    throw new Error('should provied a Promise Object')
  }
  Promise = promise
  return function runFlow (flows, inData) {
    if (type(flows) === 'array') {
      return series(flows, inData)
    } else if (type(flows) === 'object') {
      return parallel(flows, inData)
    }
 
    return Promise.resolve(null)
  }
}