on master help sign in
Update README and cabal description
commit198552e614e5c6c77ae46c1b3a2ce2a17606277b authorHarendra Kumar <harendra.kumar@gmail.com> dateTue 21 Nov 2017, 14:41 (9 years ago) parent20cc04b
2 files changed+58−38
README.md+31−20 streamly.cabal+27−18
README.md+31−20
@@ -5,26 +5,37 @@
55[![Windows Build status](https://ci.appveyor.com/api/projects/status/0g4nmxxhy9c7al30?svg=true)](https://ci.appveyor.com/project/harendra-kumar/streamly)
66[![Coverage Status](https://coveralls.io/repos/harendra-kumar/streamly/badge.svg?branch=master&service=github)](https://coveralls.io/github/harendra-kumar/streamly?branch=master)
77
8−Streamly is a general streaming and concurrent programming
9−monad allowing you to write a wide variety of applications ranging from
10−simple applications utilizing streaming IO to massively parallel concurrent
11−applications as well as reactive (FRP) applications with the same ease.
12−Streamly provides high level concurrency primitives and hides the low level
13−concurrency details completely from the programmer. The programmer just
14−expresses whether a task can run in parallel with another. Threads,
15−synchronization and concurrency rate control are handled automatically. The
16−library has been written keeping high performance applications in mind.
17−
18−Streamly subsumes all the use cases of list transformer (list-t) and logic
19−programming (logict) monads and adds concurrency on top. It is a streaming
20−library and therefore can be used for most of the streaming use cases as well
21−(i.e. where you would use conduit or pipes) with concurrency added. It is
22−also a first class reactive programming library and can be used where you
23−would use libraries like Yampa or reflex. One way to think about it is to
24−think of it as composable state machines with concurrency. You can write from
25−really simple to complex applications, from streaming to FRP or massively
26−concurrent applications using the same simple and concise abstractions.
27−
8+## Stream`ing` `Concurrent`ly
9+Streamly unifies concurrency and streaming in a single monad transformer with a
10+concise and simple API. It provides two ways to combine streams, a monadic
11+product composition as well as the standard pipelined composition provided by
12+streaming libraries. A natural extension of regular monadic composition to
13+streaming and concurrency makes it intuitive and concise with almost unviversal
14+application. You can write concurrent or non-concurrent applications using
15+simple IO, logic programming, streaming IO or reactive programming (FRP) using
16+the same API. You can also think about it as representing concurrent and
17+composable state machines in imperative terms. It unifies the core
18+functionality provided by [async](https://hackage.haskell.org/package/async),
19+[logict](https://hackage.haskell.org/package/logict),
20+[list-t](https://hackage.haskell.org/package/list-t),
21+[conduit](https://hackage.haskell.org/package/conduit)\/[pipes](https://hackage.haskell.org/package/pipes),
22+[Yampa](https://hackage.haskell.org/package/Yampa)\/[reflex](https://hackage.haskell.org/package/reflex)
23+under one type and API. It interworks with the existing streaming libraries.
24+
25+## Magical Concurrency
26+Streamly provides high level concurrency primitives (higher level than async)
27+and hides the low level concurrency details completely from the programmer.
28+Concurrency can be used with ease in applicative or monadic contexts. The
29+programmer just expresses whether a task can run in parallel with another.
30+Threads, synchronization and concurrency rate control are handled
31+automatically under the hood. The concurrency facilities provided by streamly
32+can be compared with [OpenMP](https://en.wikipedia.org/wiki/OpenMP) and
33+[Cilk](https://en.wikipedia.org/wiki/Cilk) but with a more declarative
34+expression. Concurrency support does not compromise performance in
35+non-concurrent cases, the performance of the library is at par or better than
36+most of the existing streaming libraries.
37+
38+## Example
2839Here is a simple example to concurrently and recursively list the contents of a
2940directory tree:
3041
streamly.cabal+27−18
@@ -1,25 +1,34 @@
11name: streamly
22version: 0.1.0
33synopsis: Beautiful Streaming, Concurrent and Reactive Composition
4−description: Streamly is a general streaming and concurrent programming
5− monad allowing you to write a wide variety of applications ranging from
6− simple applications utilizing streaming IO to massively parallel concurrent
7− applications as well as reactive (FRP) applications with the same ease.
8− Streamly provides high level concurrency primitives and hides the low level
9− concurrency details completely from the programmer. The programmer just
10− expresses whether a task can run in parallel with another. Threads,
11− synchronization and concurrency rate control are handled automatically. The
12− library has been written keeping high performance applications in mind.
4+description: Streamly unifies concurrency and streaming in a single monad
5+ transformer with a concise and simple API. It provides two ways to combine
6+ streams, a monadic product composition as well as the standard pipelined
7+ composition provided by streaming libraries. A natural extension of regular
8+ monadic composition to streaming and concurrency makes it intuitive and
9+ concise with almost unviversal application. You can write concurrent or
10+ non-concurrent applications using simple IO, logic programming, streaming IO
11+ or reactive programming (FRP) using the same API. You can also think about it
12+ as representing concurrent and composable state machines in imperative terms.
13+ It unifies the core functionality provided by
14+ <https://hackage.haskell.org/package/async async>,
15+ <(https://hackage.haskell.org/package/logict logict>,
16+ <https://hackage.haskell.org/package/list-t list-t>,
17+ <https://hackage.haskell.org/package/conduit conduit>\/<https://hackage.haskell.org/package/pipes pipes>,
18+ <https://hackage.haskell.org/package/Yampa Yampa>\/<https://hackage.haskell.org/package/reflex reflex>
19+ under one type and API. It interworks with the existing streaming libraries.
1320 .
14− Streamly subsumes all the use cases of list transformer (list-t) and logic
15− programming (logict) monads and adds concurrency on top. It is a streaming
16− library and therefore can be used for most of the streaming use cases as well
17− (i.e. where you would use conduit or pipes) with concurrency added. It is
18− also a first class reactive programming library and can be used where you
19− would use libraries like Yampa or reflex. One way to think about it is to
20− think of it as composable state machines with concurrency. You can write from
21− really simple to complex applications, from streaming to FRP or massively
22− concurrent applications using the same simple and concise abstractions.
21+ Streamly provides high level concurrency primitives (higher level than async)
22+ and hides the low level concurrency details completely from the programmer.
23+ Concurrency can be used with ease in applicative or monadic contexts. The
24+ programmer just expresses whether a task can run in parallel with another.
25+ Threads, synchronization and concurrency rate control are handled
26+ automatically under the hood. The concurrency facilities provided by streamly
27+ can be compared with <https://en.wikipedia.org/wiki/OpenMP OpenMP> and
28+ <https://en.wikipedia.org/wiki/Cilk Cilk> but with a more declarative
29+ expression. Concurrency support does not compromise performance in
30+ non-concurrent cases, the performance of the library is at par or better than
31+ most of the existing streaming libraries.
2332 .
2433 Here is a simple example to concurrently and recursively list the contents of
2534 a directory tree: