on master help sign in
update README and cabal description
ce63f90Harendra Kumar
README.md+40−41
@@ -8,56 +8,55 @@
8
8
9## Stream`ing` `Concurrent`ly
9## Stream`ing` `Concurrent`ly
10
10
11−Streamly, short for streaming concurrently, is a simple yet powerful streaming
11+Streamly, short for streaming concurrently, provides monadic streams, with a
12−library with concurrent merging and concurrent nested looping support. A stream
12+simple API, almost identical to standard lists, and an in-built support for
13−is just like a list except that it is a list of monadic actions rather than
13+concurrency. By using stream-style combinators on stream composition,
14−pure values. Streamly streams can be generated, consumed, combined, or
14+streams can be generated, merged, chained, mapped, zipped, and consumed
15−transformed serially or concurrently. We can loop over a stream serially or
15+concurrently – providing a generalized high level programming framework
16−concurrently. We can also have serial or concurrent nesting of loops. For
16+unifying streaming and concurrency. Controlled concurrency allows even infinite
17−those familiar with the list transformer concept streamly is a concurrent list
17+streams to be evaluated concurrently. Concurrency is auto scaled based on
18−transformer. Streamly uses standard composition abstractions. Concurrent
19−composition is just the same as serial composition except that we use a simple
20−combinator to request a concurrent composition instead of serial. The
21−programmer does not have to be aware of threads, locking or synchronization to
18+feedback from the stream consumer. The programmer does not have to be aware of
22−write scalable concurrent programs.
19+threads, locking or synchronization to write scalable concurrent programs.
23−
20+
21+The basic streaming functionality of streamly is equivalent to that provided by
24−Streamly provides functionality that is equivalent to streaming libraries
22+streaming libraries like
25−like [pipes](https://hackage.haskell.org/package/pipes) and
23+[vector](https://hackage.haskell.org/package/vector),
26−[conduit](https://hackage.haskell.org/package/conduit) but with a list like
24+[streaming](https://hackage.haskell.org/package/streaming),
27−API. The streaming API of streamly is close to the monadic streams API of the
28−[vector](https://hackage.haskell.org/package/vector) package and similar in
25+[pipes](https://hackage.haskell.org/package/pipes), and
29−concept to the [streaming](https://hackage.haskell.org/package/streaming)
26+[conduit](https://hackage.haskell.org/package/conduit).
30−package. In addition to providing streaming functionality, streamly subsumes
27+In addition to providing streaming functionality, streamly subsumes
31the functionality of list transformer libraries like `pipes` or
28the functionality of list transformer libraries like `pipes` or
32−[list-t](https://hackage.haskell.org/package/list-t) and also the logic
29+[list-t](https://hackage.haskell.org/package/list-t), and also the logic
33programming library [logict](https://hackage.haskell.org/package/logict). On
30programming library [logict](https://hackage.haskell.org/package/logict). On
34the concurrency side, it subsumes the functionality of the
31the concurrency side, it subsumes the functionality of the
35[async](https://hackage.haskell.org/package/async) package. Because it supports
32[async](https://hackage.haskell.org/package/async) package. Because it supports
36streaming with concurrency we can write FRP applications similar in concept to
33streaming with concurrency we can write FRP applications similar in concept to
37[Yampa](https://hackage.haskell.org/package/Yampa) or
34[Yampa](https://hackage.haskell.org/package/Yampa) or
38−[reflex](https://hackage.haskell.org/package/reflex). To understand the
35+[reflex](https://hackage.haskell.org/package/reflex).
39−streaming library ecosystem and where streamly fits in you may want to read
40−[streaming libraries](https://github.com/composewell/streaming-benchmarks#streaming-libraries)
41−as well. Also see the [Comparison with Existing
42−Packages](https://hackage.haskell.org/package/streamly/docs/Streamly-Tutorial.html)
43−section in the streamly tutorial.
44
36
45Why use streamly?
37Why use streamly?
46
38
47− * Simple list like streaming API, if you know how to use lists then you know
39+ * _Simplicity_: Simple list like streaming API, if you know how to use lists
48− how to use streamly.
40+ then you know how to use streamly. This library is built with simplicity
41+ and ease of use as a design goal.
49− * Powerful yet simple and scalable concurrency. Concurrency is not intrusive,
42+ * _Concurrency_: Simple, powerful, and scalable concurrency. Concurrency is
50− concurrent programs are written exactly the same way as non-concurrent
43+ built-in, and not intrusive, concurrent programs are written exactly the
51− ones. There is no other package that provides such high level, simple and
44+ same way as non-concurrent ones.
52− flexible concurrency support.
53− * It is a general programming framework providing you all the necessary tools
54− to solve a wide range of programming problems, unifying the functionality
55− provided by several disparate packages in a concise and simple API.
45+ * _Generality_: Unifies functionality provided by several disparate packages
56− * Best in class performance. See
46+ (streaming, concurrency, list transformer, logic programming, reactive
47+ programming) in a concise API.
48+ * _Performance_: Streamly is designed for high performance. See
57 [streaming-benchmarks](https://github.com/composewell/streaming-benchmarks)
49 [streaming-benchmarks](https://github.com/composewell/streaming-benchmarks)
58 for a comparison of popular streaming libraries on micro-benchmarks.
50 for a comparison of popular streaming libraries on micro-benchmarks.
59
51
52+For more details on streaming library ecosystem and where streamly fits in,
53+please see
54+[streaming libraries](https://github.com/composewell/streaming-benchmarks#streaming-libraries).
55+Also, see the [Comparison with Existing
56+Packages](https://hackage.haskell.org/package/streamly/docs/Streamly-Tutorial.html)
57+section in the streamly tutorial.
58+
60− For more information, see:
59+For more information on streamly, see:
61
60
62 * [Streamly.Tutorial](https://hackage.haskell.org/package/streamly/docs/Streamly-Tutorial.html) module in the haddock documentation for a detailed introduction
61 * [Streamly.Tutorial](https://hackage.haskell.org/package/streamly/docs/Streamly-Tutorial.html) module in the haddock documentation for a detailed introduction
63 * [examples](https://github.com/composewell/streamly/tree/master/examples) directory in the package for some simple practical examples
62 * [examples](https://github.com/composewell/streamly/tree/master/examples) directory in the package for some simple practical examples
@@ -265,7 +264,7 @@ import Path.IO (listDir, getCurrentDir)
265import Streamly
264import Streamly
266import qualified Streamly.Prelude as S
265import qualified Streamly.Prelude as S
267
266
268−main = runStream $ asyncly $ getCurrentDir >>= readdir
267+main = runStream $ aheadly $ getCurrentDir >>= readdir
269 where readdir d = do
268 where readdir d = do
270 (dirs, files) <- S.once $ listDir d
269 (dirs, files) <- S.once $ listDir d
271 S.once $ mapM_ putStrLn $ map show files
270 S.once $ mapM_ putStrLn $ map show files
@@ -275,8 +274,8 @@ main = runStream $ asyncly $ getCurrentDir >>= readdir
275
274
276In the above examples we do not think in terms of threads, locking or
275In the above examples we do not think in terms of threads, locking or
277synchronization, rather we think in terms of what can run in parallel, the rest
276synchronization, rather we think in terms of what can run in parallel, the rest
278−is taken care of automatically. When using `asyncly` the programmer does
277+is taken care of automatically. When using `aheadly` the programmer does
279−not have to worry about how many threads are to be created they are
278+not have to worry about how many threads are to be created, they are
280automatically adjusted based on the demand of the consumer.
279automatically adjusted based on the demand of the consumer.
281
280
282The concurrency facilities provided by streamly can be compared with
281The concurrency facilities provided by streamly can be compared with
streamly.cabal+37−28
@@ -2,28 +2,25 @@ name: streamly
2version: 0.2.1
2version: 0.2.1
3synopsis: Beautiful Streaming, Concurrent and Reactive Composition
3synopsis: Beautiful Streaming, Concurrent and Reactive Composition
4description:
4description:
5− Streamly, short for streaming concurrently, is a simple yet powerful
5+ Streamly, short for streaming concurrently, provides monadic streams, with a
6− streaming library with concurrent merging and concurrent nested looping
6+ simple API, almost identical to standard lists, and an in-built support for
7− support. A stream is just like a list except that it is a list of monadic
7+ concurrency. By using stream-style combinators on stream composition,
8− actions rather than pure values. Streamly streams can be generated,
8+ streams can be generated, merged, chained, mapped, zipped, and consumed
9− consumed, combined, or transformed serially or concurrently. We can loop over
9+ concurrently – providing a generalized high level programming framework
10− a stream serially or concurrently. We can also have serial or concurrent
10+ unifying streaming and concurrency. Controlled concurrency allows even
11− nesting of loops. For those familiar with list transformer concept streamly
11+ infinite streams to be evaluated concurrently. Concurrency is auto scaled
12− is a concurrent list transformer. Streamly uses standard composition
13− abstractions. Concurrent composition is just the same as serial composition
14− except that we use a simple combinator to request a concurrent composition
15− instead of serial. The programmer does not have to be aware of threads,
12+ based on feedback from the stream consumer. The programmer does not have to
16− locking or synchronization to write scalable concurrent programs.
13+ be aware of threads, locking or synchronization to write scalable concurrent
14+ programs.
17 .
15 .
18− Streamly provides functionality that is equivalent to streaming libraries
19− like <https://hackage.haskell.org/package/pipes pipes> and
20− <https://hackage.haskell.org/package/conduit conduit> but with a simple list
21− like API. The streaming API of streamly is close to the monadic streams API
16+ The basic streaming functionality of streamly is equivalent to that provided by
17+ streaming libraries like
22− of the <https://hackage.haskell.org/package/vector vector> package and
18+ <https://hackage.haskell.org/package/vector vector>,
23− similar in concept to the
19+ <https://hackage.haskell.org/package/streaming streaming>,
20+ <https://hackage.haskell.org/package/pipes pipes>, and
24− <https://hackage.haskell.org/package/streaming streaming> package. In
21+ <https://hackage.haskell.org/package/conduit conduit>.
25− addition to the streaming functionality, streamly subsumes the functionality
22+ In addition to providing streaming functionality, streamly subsumes the
26− of list transformer libraries like @pipes@ or
23+ functionality of list transformer libraries like @pipes@ or
27 <https://hackage.haskell.org/package/list-t list-t> and also the logic
24 <https://hackage.haskell.org/package/list-t list-t> and also the logic
28 programming library <https://hackage.haskell.org/package/logict logict>. On
25 programming library <https://hackage.haskell.org/package/logict logict>. On
29 the concurrency side, it subsumes the functionality of the
26 the concurrency side, it subsumes the functionality of the
@@ -32,13 +29,25 @@ description:
32 concept to <https://hackage.haskell.org/package/Yampa Yampa> or
29 concept to <https://hackage.haskell.org/package/Yampa Yampa> or
33 <https://hackage.haskell.org/package/reflex reflex>.
30 <https://hackage.haskell.org/package/reflex reflex>.
34 .
31 .
35− Streamly has excellent performance, see
36− <https://github.com/composewell/streaming-benchmarks streaming-benchmarks>
37− for a comparison of popular streaming libraries on micro-benchmarks. For
38− file IO, currently the library provides only one API to stream the lines in
32+ For file IO, currently the library provides only one API to stream the lines
39− the file as Strings. Future versions will provide better streaming file IO
33+ in the file as Strings. Future versions will provide better streaming file
40− options. Streamly interworks with the popular streaming libraries, see the
34+ IO options. Streamly interworks with the popular streaming libraries, see
41− interworking section in "Streamly.Tutorial".
35+ the interworking section in "Streamly.Tutorial".
36+ .
37+ Why use streamly?
38+ .
39+ * /Simplicity/: Simple list like streaming API, if you know how to use lists
40+ then you know how to use streamly. This library is built with simplicity
41+ and ease of use as a primary design goal.
42+ * /Concurrency/: Simple, powerful, and scalable concurrency. Concurrency is
43+ built-in, and not intrusive, concurrent programs are written exactly the
44+ same way as non-concurrent ones.
45+ * /Generality/: Unifies functionality provided by several disparate packages
46+ (streaming, concurrency, list transformer, logic programming, reactive
47+ programming) in a concise API.
48+ * /Performance/: Streamly is designed for high performance. See
49+ <https://github.com/composewell/streaming-benchmarks streaming-benchmarks>
50+ for a comparison of popular streaming libraries on micro-benchmarks.
42 .
51 .
43 Where to find more information:
52 Where to find more information:
44 .
53 .