code: function chain(fn, m) {
    if(!isFunction(fn)) {
      throw new TypeError('chain: Chain returning function required for first argument')
    }
  
    if(!(isChain(m) || isArray(m))) {
      throw new TypeError('chain: Chain of the same type required for second argument')
    }
  
    if(isArray(m)) {
      return _chain(fn, m)
    }
  
    return (m[fl.chain] || m.chain).call(m, fn)
  }
docs: chain : Chain m => (a -> m b) -> m a -> m b