# Chan A [golang](http://golang.org) like channel implementation for JavaScript that works well with [co](https://github.com/visionmedia/co). [](https://travis-ci.org/brentburgoyne/chan) [](https://codeclimate.com/github/brentburgoyne/chan) [](https://gemnasium.com/brentburgoyne/chan) ## Features - CSP Style channels in JavaScript - Buffered or Unbuffered channels - Channels can be closed - API designed to work well with generators and co - Can be used without generators - Channels can be selected similar to Go's select statement ## Installation ```bash $ npm install chan --save ``` ## The Basics Chan is inspired by golang's channels. It is implemented as a function that represents an asynchronous first in first out queue. ```js var makeChan = require('chan') // make a new unbuffered channel var ch = makeChan() typeof ch // -> 'function' ``` ### Sending values to the channel Values are added to the channel by calling the function with either `(value)` or `(error, value)`. The return value is a thunk (a function that take a node-style callback as its only argument). The callback given to the thunk is called once the value is added. ```js ch('foo')(function (err) { if (err) { // There was an error putting the value on the channel } else { // The value was successfully put on the channel } }) ``` ### Receiving values from the channel Values are removed from the channel by calling it with a node-style callback as this first argument. When a value is available on the channel the callback is called with the value or error. In this case the channel itself can also be a thunk. ```js ch(function (err, val) { // called when there is a value or error on the channel }) ``` ### Generators Because thunks are yield-able in a co generator, chan works very well when combined with co. Using them together makes chan feel very similar to go channels. ```js var co = require('co') co(function *() { var val = yield ch }) co(function *() { yield ch('foo') }) ``` ## Buffer Docs coming soon... ## Close Docs coming soon... ## Select Docs coming soon...