木の統合(SchemeをJavaScriptに移植した)

ktkreaderでアンカの親子関係を木構造にするのに使っています。
元コードはWiliki:Scheme:リスト処理

1:名無し
hoge
2:名無し
>>1 乙
3:名無し
>>1 乙
4:名無し
>>2 グッジョブ
5:名無し
>>2 グッジョブ
6:名無し
>>3 うむ >>4 おkw
7:名無し
>>3 うむ
8:名無し
>>4 おkw
9:名無し
>>4 おkw
10:名無し
>>5 神w

//tree_merge([[0,1,2],[1,3,4],[2,5,6],[3,7,5,8],[4,9]]);
//outputs:
// [[0,
//   [1,
//    [3,
//     [7],
//     [5],
//     [8]],
//    [4,
//     [9]]],
//   [2,
//    [5],
//    [6]]]]
function tree_merge(relations) {
  function pick(node,trees,relations) {
    var a = relations.partition(function(r) {return (node == r[0])});
    var picked = a[0], rest = a[1];
    if (picked.length == 0) {
      var b = trees.partition(function(t) {return (node == r[0])});
      var subtree = b[0],other_trees = b[1];
      if (subtree.length == 0) {
	return [[node],trees,relations];
      } else {
	return [subtree[0],other_trees,relations];
      }
    } else {
      var b = merge_fold(picked[0].slice(1),[],trees,rest);
      var subtrees = b[0], trees = b[1], relations=b[2];
      subtrees.unshift(node);
      return [subtrees, trees, relations];
    }
  };
  function merge_fold(kids,subtrees,trees,relations) {
    if (kids.length == 0) {
      return [subtrees.reverse(), trees, relations];
    } else {
      var a = pick(kids[0],trees,relations);
      var subtree = a[0],trees = a[1],relations = a[2];
      subtrees.unshift(subtree);
      return merge_fold(kids.slice(1),subtrees,trees,relations);
    }
  };
  function merge(trees,relations) {
    if (relations.length == 0) {
      return trees;
    } else {
      var a = pick(relations[0][0],trees,relations);
      var subtree = a[0], trees = a[1], relations = a[2];
      trees.push(subtree);
      return merge(trees,relations);
    }
  };
  return merge([],relations);
}