Skip to content

Commit

Permalink
Fix links, use link refs kept at one place
Browse files Browse the repository at this point in the history
  • Loading branch information
harendra-kumar committed Jun 2, 2021
1 parent 6cb4c3c commit 53aae83
Show file tree
Hide file tree
Showing 3 changed files with 78 additions and 65 deletions.
21 changes: 11 additions & 10 deletions INSTALL.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ SPDX-License-Identifer: BSD-3-Clause
# Getting started with the `streamly` package

This guide will show you how to write a simple program that uses
`streamly`, using the [`cabal`](https://www.haskell.org/cabal/) build
[Streamly][], using the [`cabal`](https://www.haskell.org/cabal/) build
manager for Haskell.

<!-- TODO: Add instructions for `stack` and `nix`.
Expand All @@ -21,13 +21,11 @@ to run a command-line shell under `msys` and some of the commands
below may also need to be changed in small ways to make them work.

**Note**: If you are new to Haskell you may find the [Haskell Getting
Started
Guide](https://github.com/composewell/haskell-dev/blob/master/getting-started.rst)
to be useful.
Started Guide][haskell-getting-started] to be useful.

If you know your way around Haskell, and have an up to date toolchain
already installed, then you can jump straight to the section titled
"[_Prepare Your Build Directory_](#user-content-prepare-your-build-directory)".
"[_Prepare Your Build Directory_](#prepare-your-build-directory)".

## Getting started with `streamly` using `cabal`

Expand Down Expand Up @@ -284,15 +282,18 @@ streamly][streamly-github] on Github.
If you got this far successfully, congratulations!

* For an overview of the `streamly` package, please read the
[Streamly Tutorial][tutorial].
[Streamly Quick Overview](README.md) and [Streamly Tutorial][tutorial].
* Please browse the code examples in the
[`examples`](./examples/README.md) directory.
[`Streamly examples repository`][streamly-examples].
* If you would like to start on a real world project, please take a
look at the [recommended compilation options](./docs/Build.md).

look at the [Streamly Build and Optimization Guide](./docs/Build.md).
* For more information please visit the [Streamly Homepage][Streamly].

<!-- Markdown Links -->

[tutorial]: https://hackage.haskell.org/package/streamly/docs/Streamly-Tutorial.html
[Streamly]: https://streamly.composewell.com/
[tutorial]: https://hackage.haskell.org/package/streamly-0.7.3/docs/Streamly-Tutorial.html
[streamly-hackage]: https://hackage.haskell.org/package/streamly
[streamly-github]: https://github.com/composewell/streamly
[streamly-examples]: https://github.com/composewell/streamly-examples
[haskell-getting-started]: https://github.com/composewell/haskell-dev/blob/master/getting-started.rst
116 changes: 64 additions & 52 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,37 @@
[![Gitter chat](https://badges.gitter.im/composewell/gitter.svg)](https://gitter.im/composewell/streamly)
[![Hackage](https://img.shields.io/hackage/v/streamly.svg?style=flat)](https://hackage.haskell.org/package/streamly)

[Streamly]: https://streamly.composewell.com/
<!--
Link References.
-->

[Streamly]: https://streamly.composewell.com/
[streamly-examples]: https://github.com/composewell/streamly-examples
[streaming-benchmarks]: https://github.com/composewell/streaming-benchmarks
[concurrency-benchmarks]: https://github.com/composewell/concurrency-benchmarks

<!--
Keep all the unstable links here so that they can be updated to stable
links (for online docs) before we release.
-->

<!-- examples -->
[WordCountModular.hs]: https://github.com/composewell/streamly-examples/blob/master/examples/WordCountModular.hs
[WordCount.hs]: https://github.com/composewell/streamly-examples/blob/master/examples/WordCount.hs
[WordCount.c]: https://github.com/composewell/streamly-examples/blob/master/examples/WordCount.c
[WordCountParallel.hs]: https://github.com/composewell/streamly-examples/blob/master/examples/WordCountParallel.hs
[WordCountUTF8.hs]: https://github.com/composewell/streamly-examples/blob/master/examples/WordCountUTF8.hs
[WordServer.hs]: https://github.com/composewell/streamly-examples/blob/master/examples/WordServer.hs
[MergeServer.hs]: https://github.com/composewell/streamly-examples/blob/master/examples/MergeServer.hs
[ListDir.hs]: https://github.com/composewell/streamly-examples/blob/master/examples/ListDir.hs
[Rate.hs]: https://github.com/composewell/streamly-examples/blob/master/examples/Rate.hs
[AcidRain.hs]: https://github.com/composewell/streamly-examples/tree/master/examples/AcidRain.hs
[CirclingSquare.hs]: https://github.com/composewell/streamly-examples/tree/master/examples/CirclingSquare.hs

<!-- local files -->
[LICENSE]: https://github.com/composewell/streamly/blob/master/LICENSE
[CONTRIBUTING.md]: https://github.com/composewell/streamly/blob/master/CONTRIBUTING.md
[docs]: https://github.com/composewell/streamly/blob/master/docs/

Streamly is a Haskell library that provides the building blocks to build
safe, scalable, modular and high performance software. Streamly offers:
Expand Down Expand Up @@ -91,10 +121,8 @@ example, we will use `Fold`s to count the number of bytes, words and lines
present in a file. We will then compose individual `Fold`s together to
count words, bytes and lines at the same time.

Please see the file
[WordCountModular.hs](https://github.com/composewell/streamly-examples/blob/master/examples/WordCountModular.hs)
for the complete example program, including the imports that we have
omitted here.
Please see the file [WordCountModular.hs][] for the complete example
program, including the imports that we have omitted here.

#### Count Bytes (wc -c)

Expand Down Expand Up @@ -185,7 +213,7 @@ We compare two equivalent implementations: one using [Streamly][],
and the other using C.

The performance of the [Streamly word counting
implementation](https://github.com/composewell/streamly-examples/blob/master/examples/WordCount.hs) is:
implementation][WordCount.hs] is:

```
$ time WordCount-hs gutenberg-500MB.txt
Expand All @@ -196,7 +224,7 @@ user 0m1.697s
sys 0m0.128s
```

The performance of an equivalent [wc implementation in C](https://github.com/composewell/streamly-examples/blob/master/examples/WordCount.c) is:
The performance of an equivalent [wc implementation in C][WordCount.c] is:

```
$ time WordCount-c gutenberg-500MB.txt
Expand All @@ -217,10 +245,8 @@ To count words in parallel we first divide the stream into chunks
counts across chunks. We use the same code as above except that we use
arrays for our input data.

Please see the file
[WordCountParallel.hs](https://github.com/composewell/streamly-examples/blob/master/examples/WordCountParallel.hs)
for the complete working code for this example, including the imports
that we have omitted below.
Please see the file [WordCountParallel.hs][] for the complete working
code for this example, including the imports that we have omitted below.

The `countArray` function counts the line, word, char counts in one chunk:

Expand All @@ -235,7 +261,7 @@ countArray arr =
```

Here the function `count` and the `Counts` data type are defined in the
`WordCount` helper module defined in [WordCount.hs](https://github.com/composewell/streamly-examples/blob/master/examples/WordCount.hs).
`WordCount` helper module defined in [WordCount.hs][].

When combining the counts in two contiguous chunks, we need to check
whether the first element of the next chunk is a whitespace character
Expand Down Expand Up @@ -299,9 +325,8 @@ user 0m1.952s
sys 0m0.140s
```

These example programs have assumed ASCII encoded
input data. For UTF-8 streams, we have a [concurrent wc
implementation](https://github.com/composewell/streamly-examples/blob/master/examples/WordCountUTF8.hs)
These example programs have assumed ASCII encoded input data. For UTF-8
streams, we have a [concurrent wc implementation][WordCountUTF8.hs]
with UTF-8 decoding. This concurrent implementation performs as well
as the standard `wc` program in serial benchmarks. In concurrent mode
[Streamly][]'s implementation can utilise multiple processing cores if
Expand All @@ -321,10 +346,8 @@ dictionary lookup server which can serve word meanings to multiple
clients concurrently. This example demonstrates the use of the concurrent
`mapM` combinator.

Please see the file
[WordServer.hs](https://github.com/composewell/streamly-examples/blob/master/examples/WordServer.hs)
for the complete code for this example, including the imports that we
have omitted below.
Please see the file [WordServer.hs][] for the complete code for this
example, including the imports that we have omitted below.

```haskell
import qualified Streamly.Data.Fold as Fold
Expand Down Expand Up @@ -376,10 +399,8 @@ the merged logs are written to a file or to a network destination.
This example uses the `concatMapWith` combinator to merge multiple
streams concurrently.

Please see the file
[MergeServer.hs](https://github.com/composewell/streamly-examples/blob/master/examples/MergeServer.hs)
for the complete working code, including the imports that we have
omitted below.
Please see the file [MergeServer.hs][] for the complete working code,
including the imports that we have omitted below.

```haskell
import qualified Streamly.Data.Unfold as Unfold
Expand Down Expand Up @@ -425,10 +446,8 @@ values back to the input, while it lets the `Right` values (file names
in this case) pass through to the output. The `Stream.ahead` stream
joining combinator then makes it iterate on the directories concurrently.

Please see the file
[ListDir.hs](https://github.com/composewell/streamly-examples/blob/master/examples/ListDir.hs)
for the complete working code, including the imports that we have
omitted below.
Please see the file [ListDir.hs][] for the complete working code,
including the imports that we have omitted below.

```haskell
import Streamly.Internal.Data.Stream.IsStream (iterateMapLeftsWith)
Expand Down Expand Up @@ -469,17 +488,14 @@ main =
& Stream.mapM_ print -- IO ()
```

Please see the file
[Rate.hs](https://github.com/composewell/streamly-examples/blob/master/examples/Rate.hs)
for the complete working code.
Please see the file [Rate.hs][] for the complete working code.

The concurrency of the stream is automatically controlled to match the
specified rate. [Streamly][]'s rate control works precisely even at
throughputs as high as millions of yields per second.

For more sophisticated rate control needs please see the [Haddock
documentation](https://hackage.haskell.org/package/streamly-0.7.3/docs/Streamly.html)
for the Streamly.
For more sophisticated rate control needs please see the Streamly [reference
documentation][Streamly].

### Reactive Programming

Expand All @@ -491,23 +507,21 @@ Please also see the pre-release sampling combinators in the
`Streamly.Internal.Data.Stream.IsStream.Top` module for `throttle` and
`debounce` like operations.

The examples
[AcidRain.hs](https://github.com/composewell/streamly-examples/tree/master/examples/AcidRain.hs)
and
[CirclingSquare.hs](https://github.com/composewell/streamly-examples/tree/master/examples/CirclingSquare.hs)
demonstrate reactive programming using [Streamly][].
The examples [AcidRain.hs][] and [CirclingSquare.hs][] demonstrate
reactive programming using [Streamly][].

### More Examples

If you would like to view more examples, please visit the [Streamly
Examples](https://github.com/composewell/streamly-examples) web page.
Examples][streamly-examples] web page.

### Further Reading

* [Streaming Benchmarks](https://github.com/composewell/streaming-benchmarks) | [Concurrency Benchmarks](https://github.com/composewell/concurrency-benchmarks)
* [Functional Conf 2019 Video](https://www.youtube.com/watch?v=uzsqgdMMgtk) | [Functional Conf 2019 Slides](https://www.slideshare.net/HarendraKumar10/streamly-concurrent-data-flow-programming)
* [Streaming Benchmarks][streaming-benchmarks]
* [Concurrency Benchmarks][concurrency-benchmarks]
* Functional Conf 2019 [Video](https://www.youtube.com/watch?v=uzsqgdMMgtk) | [Slides](https://www.slideshare.net/HarendraKumar10/streamly-concurrent-data-flow-programming)
* [Other Guides](docs/)
* [Streamly Homepage](https://streamly.composewell.com)
* [Streamly Homepage][Streamly]

## Performance

Expand Down Expand Up @@ -536,8 +550,8 @@ you use this plugin for applications that are performance sensitive.

We measured several Haskell streaming implementations
using various micro-benchmarks. Please see the [streaming
benchmarks](https://github.com/composewell/streaming-benchmarks) page
for a detailed comparison of Streamly against other streaming libraries.
benchmarks][streaming-benchmarks] page for a detailed comparison of
Streamly against other streaming libraries.

Our results show that [Streamly][] is the fastest effectful streaming
implementation on almost all the measured microbenchmarks. In many cases
Expand All @@ -558,8 +572,8 @@ programming with streams and arrays, for reading and writing from the
file system and from the network, for time domain programming (reactive
programming), and for reacting to file system events using `fsnotify`.

Please view [Streamly's documentation](https://streamly.composewell.com)
for more information about Streamly's features.
Please view [Streamly's documentation][Streamly] for more information
about Streamly's features.

### Concurrency

Expand All @@ -577,9 +591,8 @@ very little overhead even where the task size is very
small, because Streamly will automatically switch between
serial or batched execution of tasks on the same CPU depending
on whichever is more efficient. Please see our [concurrency
benchmarks](https://github.com/composewell/concurrency-benchmarks) for
more detailed performance measurements, and for a comparison with the
`async` package.
benchmarks][concurrency-benchmarks] for more detailed performance
measurements, and for a comparison with the `async` package.

### Design Goals

Expand Down Expand Up @@ -618,14 +631,13 @@ list of contributors, credits and licenses.
## Licensing

Streamly is an [open source](https://github.com/composewell/streamly)
project available under a liberal [BSD-3-Clause
license](https://github.com/composewell/streamly/blob/master/LICENSE).
project available under a liberal [BSD-3-Clause license][LICENSE]

## Contributing to Streamly

As an open project we welcome contributions:

* [Streamly Contributor's Guide](CONTRIBUTING.md)
* [Streamly Contributor's Guide][CONTRIBUTING.md]
* [Contact the streamly development team](mailto:[email protected])

## Getting Support
Expand Down
6 changes: 3 additions & 3 deletions streamly.cabal
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
cabal-version: 2.2
name: streamly
version: 0.7.2
synopsis: Data flow programming and declarative concurrency
synopsis: Dataflow programming and declarative concurrency
description:
<https://streamly.composewell.com Streamly> is a framework to build
reliable and scalable software systems from modular building blocks
using data flow programming (streaming) and declarative concurrency.
using dataflow programming (streaming) and declarative concurrency.
Powerful stream fusion framework in streamly allows high-performance,
modular combinatorial programming. Key features include:
.
Expand All @@ -28,7 +28,7 @@ description:
<https://streamly.composewell.com Streamly homepage>.
.

homepage: https://github.com/composewell/streamly
homepage: https://streamly.composewell.com
bug-reports: https://github.com/composewell/streamly/issues
license: BSD-3-Clause
license-file: LICENSE
Expand Down

0 comments on commit 53aae83

Please sign in to comment.