Skip to content

Instantly share code, notes, and snippets.

@cqfd
Last active August 29, 2015 14:24
Show Gist options
  • Save cqfd/edec57fee9ca89fb2e07 to your computer and use it in GitHub Desktop.
Save cqfd/edec57fee9ca89fb2e07 to your computer and use it in GitHub Desktop.
Summary: asynchrony with promises and generators.

Yield for sequencing

pogo : *r -> promise[r]

pogo(function*() {
  yield sleep(1000)
  const json = yield $.getJSON('/endpoint')
  return json
  
  // or: return yield $.getJSON('/endpoint')
}())

Lift for concurrency

function lift(f) {
  return function(...promises) {
    return Promise.all(promises).then(values => f(...values))
  }
}

// Simple, one-argument example

// getFirstName : user -> string
function getFirstName(user) {
  return user.name.split(' ')[0]
}

// lift(getFirstName) : promise[user] -> promise[string]

const userPromise = $.getJSON('/users/1')
const firstNamePromise = lift(getFirstName)(userPromise)

// Multi-argument example

// add : ...num -> num
function add(...nums) {
  return nums.reduce((sum, n) => sum + n)
}

// lift(add) : ...promise[num] -> promise[num]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment