       joinAsyncFns fns, (err, results)-> 
         outCallback err, result
    
-
-runReduce = (data, fn, memo, outCallback)->
-  debug 'runReduce', arguments
-  return outCallback null, memo if data.length is 0
-  [head, others...] = data
-  fn memo, head, (err, newMemo)->
-    return outCallback err if err
-    runReduce others, fn, newMemo, outCallback
       
 _reduce = (memo, fn)->
   return (data, outCallback)->




make = 
  http: ()->
    return (req,res,next)->
      req.tmp = req.tmp || {}
      req.data = req.data || {}
      
      res.tmp = res.tmp || {}
      res.data = res.data || {}
      next()


 
handover = (hands)-> return _flow(hands)

handover.hands = {}
handover.make = make
# handover.mk = 
  # retry: _retry
  # map : _map
handover.flow = _flow
# handover.fnForkJoin = fnForkJoin
handover.chain = _chain
# handover.compose = _compose
handover.map = _map
handover.reduce = _reduce
handover.retry = _retry
module.exports = exports = handover
    return outCallback null, output... if fns.length is 0 
    runChain fns, output, outCallback 
 


runReduce = (data, fn, memo, outCallback)->
  # debug 'runReduce', arguments
  return outCallback null, memo if data.length is 0
  [head, others...] = data
  fn memo, head, (err, newMemo)->
    return outCallback err if err
    runReduce others, fn, newMemo, outCallback

runSerise = (data, fn, results, outCallback)->
  # debug 'runSerise', arguments
  return outCallback null, results if data.length is 0
  [head, others...] = data
  fn memo, head, (err, output)->
    return outCallback err if err
    results.push output
    runSerise others, fn, results, outCallback

_serise = (fn)->
  return (data, outCallback)-> 
    runSerise data, fn, [], outCallback

_map = (fn)->
  return (data, outCallback)->
