GithubHelp home page GithubHelp logo

gocsp's Introduction

Communication Sequential Processes in Javascript

Bring Golang-like CSP channel to JS land.

It's based on Promise and works well with generator or async-await function.

Installation

$ npm install gocsp

Usage

Very similar to how channel works in Golang. You can take, put or select values from channels.

var co = require('co')
var csp = require('gocsp')

// from http://talks.golang.org/2013/advconc.slide#6

var player = co.wrap(function* (name, ch) {
    for (;;) {
        var ball = (yield csp.take(ch)).value
        ball += 1
        console.log(name, ball)
        yield csp.timeout(100)
        yield csp.put(ch, ball)
    }
})

co(function* () {
    var ch = csp.chan()

    player('ping', ch)
    player('pong', ch)

    yield csp.put(ch, 0)
    yield csp.timeout(1000)
    yield csp.take(ch)
})

API

csp.chan(size)

Create a channel. You can optional support a queue size, default is 0.

csp.chan() // without queue

csp.chan(2) // with queue size 2

csp.take(ch)

Take a value from channel, returns a promise

csp.take(ch).then(function (result) {
    var { done, value } = result
    if (done) {
        // channel is closed, fail to take a value
    } else {
        // success to take value
        console.log(value)
    }
})

csp.put(ch, value)

Put a value into channel, return a promise

csp.put(ch, value).then(function (ok) {
    // if success, then `ok === true`
    // if failed (e.g. channel closed), then `ok === fasle`
})

csp.close(ch)

Close a channel. When channel is closed, you cannot put values into it anymore. You may still be able to take remaining queued values from channel.

csp.close(ch)

csp.select(fn)

Choose one of a set of take or put, timeout operations. At most one will success and rest will be cancelled.

csp.select(function (s) {
    s.take(ch, function (result) {
        // like `csp.take`, result have two property: `done` & `value`
        var { done, value } = result
    })
    ||
    s.put(ch2, value, function (ok) {
        // ok is boolean
    })
    ||
    s.timeout(1000, function () {

    })
    ||
    s.default(function () {
        // if none of above chosen. They will all be cancelled.
        // and this function will be called.
    })
})

License

MIT

gocsp's People

Contributors

gyson avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar

Forkers

zensh

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.