make.js
function arrayGroup (set, get, reduce) {

  //we can use a different lookup path on the right hand object
  //is always the "needle"
  function _compare (hay, needle) {
    for(var i in set) {
      var x = u.get(hay, set[i]), y = needle[i]
      if(x !== y) return compare(x, y)
    }
    return 0
  }

  return function (a, b) {
    if(a && !Array.isArray(a)) a = reduce([], a)
    var A = a = a || []
    var i = search(A, get.map(function (fn) { return fn(b) }), _compare)

    if(i >= 0) A[i] = reduce(A[i], b)
    else       A.splice(~i, 0, reduce(undefined, b))

    return a
  }
}
function arrayGroup (set, get, reduce) {

  //we can use a different lookup path on the right hand object
  //is always the "needle"
  function _compare (hay, needle) {
    for(var i in set) {
      var x = u.get(hay, set[i]), y = needle[i]
      if(x !== y) return compare(x, y)
    }
    return 0
  }

  return function (a, b) {
    if(a && !Array.isArray(a)) a = reduce([], a)
    var A = a = a || []
    var i = search(A, get.map(function (fn) { return fn(b) }), _compare)

    if(i >= 0) A[i] = reduce(A[i], b)
    else       A.splice(~i, 0, reduce(undefined, b))

    return a
  }
}
function arrayGroup ( set , get , reduce ) { //we can use a different lookup path on the right hand object //is always the "needle" function _compare ( hay , needle ) { for ( var i in set ) { var x = u . get ( hay , set [ i ] ) , y = needle [ i ] if ( x !== y ) return compare ( x , y ) } return 0 } return function ( a , b ) { if ( a && ! Array . isArray ( a ) ) a = reduce ( [ ] , a ) var A = a = a || [ ] var i = search ( A , get . map ( function ( fn ) { return fn ( b ) } ) , _compare ) if ( i >= 0 ) A [ i ] = reduce ( A [ i ] , b ) else A . splice ( ~ i , 0 , reduce ( undefined , b ) ) return a } }
rawpaths, reducedpaths, reduce
rawpaths reducedpaths reduce