Skip to content

Instantly share code, notes, and snippets.

@Gozala
Created January 4, 2013 01:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Gozala/4449153 to your computer and use it in GitHub Desktop.
Save Gozala/4449153 to your computer and use it in GitHub Desktop.
Restructures items using given `f`.
function restructure(input, f, start) {
return reducible(function(next, initial) {
var state = start
return reduce(input, function(item, result) {
var change = [].concat(f(item, state))
state = change[0]
var value = change[1]
return value ? next(value, result) :
result
}, initial)
})
}
@Gozala
Copy link
Author

Gozala commented Jan 4, 2013

var coreduction = require("coreduction")
var restructure = require("restructure")

function sort(f, left, right) {
  var pairs = coreduction(left, right)
  return restructure(pairs, function(pair, buffer) {
    buffer = buffer.concat(pair).sort(f)
    return [buffer, buffer.shift()]
  }, [])
}

@Gozala
Copy link
Author

Gozala commented Jan 4, 2013

var restructure = require("restructure")

function sort(f, left, right) {
  left = map(left, function(item) { return { left: item })
  right = map(right, function(item) { return { right: item })
  var sorted = reductions(merge(left, right), function(state, item) {
    var isLeft = 'left' in item
    var value = isLeft ? item.left : item.right
    buffer.push(value)
    if (buffer.length > 1 && isLeft !== state.isLeft) {
      buffer = buffer.sort(f)
      return { buffer: buffer, value: buffer.shift(), skip: false }
    } else {
      return { buffer: buffer, skip: true }
    }
  }, { buffer: [] })

  var items = filter(sorted, function(item) { return !item.skip })
  return map(items, function(item) { return item.value })
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment