You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A library that brings all the CSP joy to the Elixir land.
The aim of this library is to make it simple to work with CSP channels
alongside Elixir actors and supervision trees, so that we can have
another tool in our pockets, choosing it where it fits best.
Highly inspired on Go channels and Clojure core.async library.
Suggestions and pull requests are more than welcome.
Examples
You can simply create a channel and pass it to other processes:
channel=Channel.newpid=spawn_linkfn-># This line will block until the data is readChannel.put(channel,:some)Channel.put(channel,:data)endProcess.alive?(pid)#=> trueChannel.get(channel)#=> :someProcess.alive?(pid)#=> trueChannel.get(channel)#=> :dataProcess.alive?(pid)#=> false
Or you can use a channel as part of a supervision tree:
importSupervisor.Specchildren=[worker(Channel,[[name: MyApp.Channel]])]{:ok,pid}=Supervisor.start_link(children,strategy: :one_for_one)spawn_linkfn-># This line will block until some data is written to the channeldata=Channel.get(MyApp.Channel)IO.puts"I read #{inspectdata} from the channel."endChannel.put(MyApp.Channel,:data)
In any of the cases you can use a channel like any Enumerable or Colectable:
# Wraps the process name into a channel struct# Works with PIDs toomy_channel=Channel.wrap(MyApp.Channel)spawn_linkfn-># Blocks until all the values can be writtenEnum.into(1..10,my_channel)end# The buffer size means how many values I can put in a channel until it# starts blocking.other_channel=Channel.new(buffer_size: 10)# The code bellow will block until the channel "my_channel" is closed.forx<-my_channel,into: other_channeldox*2end
Installing
Add the dependency to the mix.exs file:
deps: [{:cspex,"~> x.x.x"}, ...]
Add the following snippet to anywhere you want to use it: