README.md in datapipes-0.0.2 vs README.md in datapipes-0.0.3
- old
+ new
@@ -1,9 +1,52 @@
datapipes [![Build Status](https://travis-ci.org/taiki45/datapipes.svg?branch=master)](https://travis-ci.org/taiki45/datapipes)
=========
-datapipes is multi-streaming library.
+datapipes is an asynchronous multi streaming library.
+## About
+datapipes encourages to handle multi streamings asynchronously. datapipes has
+a few objects sparated by its responsibility.
+
+- __Source__ Produces resources and emits the resource to pipe.
+- __Tube__ Effector for resources. Processes resource in the middle of pipe.
+- __Sink__ Consumer for resources. Do something with processed resources.
+- __Pipe__ Resources pass through the pipe. Handles resources asynchronously.
+
+```
+ Source
+ | ↓ data flow
+ |
+ Tube
+ | pipe is '|'
+ |
+Consumer
+```
+
+To handle multi streamings, datapipes offers composabiliy. Source, Tube and Sink
+are composable individually. So the diagram above will be:
+
+```
+ Composed Source works asynchronously
+
+ [Source Source Source]
+ |
+ | pipe handles asynchronous
+ |
+ Tube
+ Tube Composed Tube has individual tube in series
+ Tube
+ Tube
+ |
+ |
+ |
+ Sink
+ Sink
+ Sink
+
+ Composed Sink works synchronously
+```
+
## Installation
Add this line to your application's Gemfile:
gem 'datapipes'
@@ -15,11 +58,88 @@
Or install it yourself as:
$ gem install datapipes
## Usage
+You have to define your own Source, Tube and Sink.
-TODO: Write usage instructions here
+A basic source is list type. it produces a value in several times.
+Use `produce` method to emit data to pipe.
+
+```ruby
+class List < Datapipes::Source
+ def run
+ (1..10).each {|i| produce(i) }
+ end
+end
+```
+
+Next is tube. Tube processes piped data. A example tube recieve
+Integer value then increase amount of the value.
+
+Define `accept?` to recieve the data or skip this.
+
+```ruby
+class Triple < Datapipes::Tube
+ def run(data)
+ [data, data, data]
+ end
+
+ def accept?(data)
+ data.is_a? Integer and data > 3
+ end
+end
+```
+
+Sink consumes piped data. A typical sink is printing data.
+
+```ruby
+class Print < Datapipes::Sink
+ def run(data)
+ puts data
+ end
+
+ def accept?(data)
+ data.is_a? Array and data[0] < 7
+ end
+end
+```
+
+You can make your own datapipe with your objects.
+
+```ruby
+datapipe = Datapipes.new(
+ List.new, # A source
+ Triple.new, # A tube
+ Print.new, # A sink
+ Datapipes::Pipe.new # A pipe
+)
+```
+
+Then just run everything with `run_resource`.
+
+```ruby
+datapipe.run_resource
+```
+
+The output will be:
+
+```
+4
+4
+4
+5
+5
+5
+6
+6
+6
+```
+
+Congratulation!!
+
+### Composing objects
+TODO...
## Contributing
1. Fork it ( http://github.com/<my-github-username>/datapipes/fork )
2. Create your feature branch (`git checkout -b my-new-feature`)