4synopsis: Beautiful Streaming, Concurrent and Reactive Composition
6 Streamly is a framework for writing programs in a high level, declarative
7 data flow programming paradigm. It provides a simple API, very close to
8 standard Haskell lists. A program is expressed as a composition of data
9 processing pipes, generally known as streams. Streams can be generated,
10 merged, chained, mapped, zipped, and consumed concurrently – enabling a high
11 level, declarative yet concurrent composition of programs. Programs can be
12 concurrent or non-concurrent without any significant change. Concurrency is
13 auto scaled based on consumption rate. Programmers do not have to be aware
14 of threads, locking or synchronization to write scalable concurrent programs.
15 Streamly provides C like performance, orders of magnitude better compared to
16 existing streaming libraries.
18 Streamly is designed to express the full spectrum of programs with highest
19 performance. Do not think that if you are writing a small and simple program
20 it may not be for you. It expresses a small "hello world" program with the
21 same efficiency, simplicity and elegance as a large scale concurrent
22 application. It unifies many different aspects of special purpose libraries
23 into a single yet simple framework.
25 Streamly covers the functionality provided by Haskell lists as well as the
26 functionality provided by streaming libraries like
27 <https://hackage.haskell.org/package/streaming streaming>,
28 <https://hackage.haskell.org/package/pipes pipes>, and
29 <https://hackage.haskell.org/package/conduit conduit> with a simpler API and
30 better performance. Streamly provides
31 advanced stream composition including various ways of appending, merging,
32 zipping, splitting, grouping, distributing, partitioning and unzipping of
33 streams with true streaming and with concurrency. Streamly subsumes the
34 functionality of list transformer libraries like @pipes@ or
35 <https://hackage.haskell.org/package/list-t list-t> and also the logic
36 programming library <https://hackage.haskell.org/package/logict logict>.
37 The grouping, splitting and windowing combinators in streamly can be compared
38 to the window operators in <https://flink.apache.org/ Apache Flink>.
39 However, compared to Flink streamly has a pure functional, succinct and
42 The concurrency capabilities of streamly are much more advanced and powerful
43 compared to the basic concurrency functionality provided by the
44 <https://hackage.haskell.org/package/async async> package. Streamly is a
45 first class reactive programming library. If you are familiar with
46 <http://reactivex.io/ Reactive Extensions> you will find that it is very
47 similar. For most RxJs combinators you can find or write corresponding ones
48 in streamly. Streamly can be used as an alternative to
49 <https://hackage.haskell.org/package/Yampa Yampa> or
50 <https://hackage.haskell.org/package/reflex reflex> as well.
52 Streamly focuses on practical engineering with high performance. From well
53 written streamly programs one can expect performance competitive to C. High
54 performance streaming eliminates the need for string and text libraries like
55 <https://hackage.haskell.org/package/bytestring bytestring>,
56 <https://hackage.haskell.org/package/text text> and their lazy and strict
57 flavors. The confusion and cognitive overhead arising from different
58 string types is eliminated. The two fundamental types in streamly are arrays
59 for storage and streams for processing. Strings and text are simply streams
60 or arrays of 'Char' as they should be. Arrays in streamly have performance
61 at par with the vector library.
63 Where to find more information:
65 * /Quick Overview/: <#readme README file> in the package
66 * /Building/: <src/docs/Build.md Build guide> for optimal performance
67 * /Detailed Tutorial/: "Streamly.Tutorial" module in the haddock documentation
68 * /Interoperation/: "Streamly.Tutorial" module for interop with other
70 * /Reference Documentation/: Haddock documentation for the respective modules
71 * /Examples/: <src/examples examples directory> in the package
72 * /Guides/: <src/docs docs directory> in the package, for documentation on
73 advanced topics, limitations, semantics of the library or on specific use
75 * <https://github.com/composewell/streaming-benchmarks Streaming Benchmarks>
76 * <https://github.com/composewell/concurrency-benchmarks Concurrency Benchmarks>
80homepage: https://github.com/composewell/streamly
81bug-reports: https://github.com/composewell/streamly/issues
84tested-with: GHC==7.10.3
90maintainer: streamly@composewell.com
91copyright: 2017 Harendra Kumar
92category: Control, Concurrency, Streaming, Reactivity
93stability: Experimental
99 credits/base-4.12.0.0.txt
100 credits/bjoern-2008-2009.txt
101 credits/clock-0.7.2.txt
102 credits/foldl-1.4.5.txt
103 credits/pipes-concurrency-2.0.8.txt
104 credits/pipes-concurrency.txt
105 credits/transient-0.5.5.txt
106 credits/vector-0.12.0.2.txt
107 credits/Yampa-0.10.6.2.txt
109 docs/streamly-vs-async.md
110 docs/streamly-vs-lists.md
117 src/Streamly/Internal/Data/Stream/Instances.hs
121 src/Streamly/Internal/Data/Time/config.h.in
127 src/Streamly/Internal/Data/Time/config.h
129source-repository head
131 location: https://github.com/composewell/streamly
134 description: Enable inspection testing
139 description: Debug build with asserts enabled
144 description: Development build
149 description: Use llvm backend for better performance
154 description: Disable chart generation
159 description: Disable rewrite rules
164 description: Use CPS style streams when possible
169 description: Build including examples
174 description: Build including SDL examples
178-------------------------------------------------------------------------------
180-------------------------------------------------------------------------------
182common compile-options
183 default-language: Haskell2010
185 cpp-options: -DUSE_STREAMK_ONLY
188 cpp-options: -DDISABLE_FUSION
191 cpp-options: -DDEVBUILD
194 cpp-options: -DINSPECTION
202 ghc-options: -Wmissed-specialisations
203 -Wall-missed-specialisations
205 if flag(dev) || flag(debug)
206 ghc-options: -fno-ignore-asserts
209 ghc-options: -Wcompat
210 -Wunrecognised-warning-flags
212 -Wincomplete-record-updates
213 -Wincomplete-uni-patterns
214 -Wredundant-constraints
215 -Wnoncanonical-monad-instances
217common optimization-options
219 -fspec-constr-recursive=16
222common threading-options
223 ghc-options: -threaded
226-- We need optimization options here to optimize internal (non-inlined)
227-- versions of functions. Also, we have some benchmarking inspection tests
228-- part of the library when built with --benchmarks flag. Thos tests fail
229-- if we do not use optimization options here. It was observed that due to
230-- -O2 here some concurrent/nested benchmarks improved and others regressed.
231-- We can investigate a bit more here why the regression occurred.
233 import: compile-options, optimization-options
235-- Compilation for coverage builds on CI machines takes too long without -O0
236-- XXX we should use coverage flag for that, -O0 may take too long to run tests
239 import: compile-options, threading-options
243-- Used by maxrate test, benchmarks and executables
245 import: compile-options, optimization-options, threading-options
247-- Some benchmarks are threaded some are not
248-- XXX dependencies should be separated under bench-depends
250 import: compile-options, optimization-options
251 ghc-options: -with-rtsopts "-T -M256M"
252 build-depends: mtl >= 2.2 && < 3
254common bench-options-threaded
255 import: compile-options, optimization-options
256 -- -threaded and -N2 is important because some GC and space leak issues
257 -- trigger only with these options.
258 ghc-options: -threaded -with-rtsopts "-T -N2 -M256M"
259 build-depends: mtl >= 2.2 && < 3
261-------------------------------------------------------------------------------
263-------------------------------------------------------------------------------
267 js-sources: jsbits/clock.js
268 include-dirs: src/Streamly/Internal/Data/Time
271 c-sources: src/Streamly/Internal/Data/Time/Windows.c
273 c-sources: src/Streamly/Internal/Data/Time/Darwin.c
277 , Streamly.Data.SmallArray
278 , Streamly.Data.Prim.Array
281 Streamly.Memory.Malloc
282 , Streamly.Memory.Ring
284 , Streamly.FileSystem.IOVec
285 , Streamly.FileSystem.FDIO
286 , Streamly.FileSystem.FD
292 , Streamly.Data.Unfold
293 , Streamly.Data.Unicode.Stream
296 , Streamly.Memory.Array
297 , Streamly.FileSystem.Handle
302 , Streamly.Internal.Control.Monad
303 , Streamly.Internal.Data.Strict
304 , Streamly.Internal.Data.Atomics
305 , Streamly.Internal.Data.Time
306 , Streamly.Internal.Data.Time.Units
307 , Streamly.Internal.Data.Time.Clock
308 , Streamly.Internal.Data.SVar
309 , Streamly.Internal.Data.Array
310 , Streamly.Internal.Data.Prim.Array
311 , Streamly.Internal.Data.SmallArray
312 , Streamly.Internal.Memory.Array.Types
313 , Streamly.Internal.Memory.Array
314 , Streamly.Internal.Memory.ArrayStream
315 , Streamly.Internal.Data.Fold.Types
316 , Streamly.Internal.Data.Fold
317 , Streamly.Internal.Data.Sink.Types
318 , Streamly.Internal.Data.Sink
321 , Streamly.Internal.Data.Stream.StreamK.Type
322 , Streamly.Internal.Data.Stream.StreamK
323 , Streamly.Internal.Data.Stream.StreamD.Type
324 , Streamly.Internal.Data.Stream.StreamD
325 , Streamly.Internal.Data.Stream.StreamDK.Type
326 , Streamly.Internal.Data.Stream.StreamDK
327 , Streamly.Internal.Data.Stream.Enumeration
328 , Streamly.Internal.Data.Stream.Prelude
330 -- Higher level streams
331 , Streamly.Internal.Data.Stream.SVar
332 , Streamly.Internal.Data.Stream.Serial
333 , Streamly.Internal.Data.Stream.Async
334 , Streamly.Internal.Data.Stream.Parallel
335 , Streamly.Internal.Data.Stream.Ahead
336 , Streamly.Internal.Data.Stream.Zip
337 , Streamly.Internal.Data.Stream.Combinators
338 , Streamly.Internal.Data.Unfold.Types
339 , Streamly.Internal.Data.Unfold
340 , Streamly.Internal.Data.Pipe.Types
341 , Streamly.Internal.Data.Pipe
342 , Streamly.Internal.Data.List
343 , Streamly.Internal.FileSystem.Handle
344 , Streamly.Internal.FileSystem.Dir
345 , Streamly.Internal.FileSystem.File
346 , Streamly.Internal.Data.Unicode.Stream
347 , Streamly.Internal.Data.Unicode.Char
348 , Streamly.Internal.Memory.Unicode.Array
349 , Streamly.Internal.Prelude
352 , Streamly.Internal.Mutable.Prim.Var
356 Streamly.Network.Socket
357 , Streamly.Network.Inet.TCP
359 , Streamly.Internal.Network.Socket
360 , Streamly.Internal.Network.Inet.TCP
363 -- Core libraries shipped with ghc, the min and max
364 -- constraints of these libraries should match with
365 -- the GHC versions we support
367 , containers >= 0.5 && < 0.7
368 , deepseq >= 1.4.1 && < 1.5
369 , directory >= 1.3 && < 1.4
370 , ghc-prim >= 0.2 && < 0.6
371 , transformers >= 0.4 && < 0.6
373 , heaps >= 0.3 && < 0.4
374 , primitive >= 0.6.4.0 && < 0.8
377 , atomic-primops >= 0.8 && < 0.9
378 , lockfree-queue >= 0.2.3 && < 0.3
381 , exceptions >= 0.8 && < 0.11
382 , monad-control >= 1.0 && < 2
384 , transformers-base >= 0.4 && < 0.5
388 network >= 2.6 && < 4
391 semigroups >= 0.18 && < 0.19
393 -- Array uses a Storable constraint in dev build making several inspection
395 if flag(dev) && flag(inspection)
396 build-depends: inspection-and-dev-flags-cannot-be-used-together
398-------------------------------------------------------------------------------
400-------------------------------------------------------------------------------
404 type: exitcode-stdio-1.0
406 js-sources: jsbits/clock.js
411 , hspec >= 2.0 && < 3
412 , containers >= 0.5 && < 0.7
413 , transformers >= 0.4 && < 0.6
415 , exceptions >= 0.8 && < 0.11
416 default-language: Haskell2010
418test-suite internal-prelude-test
420 type: exitcode-stdio-1.0
421 main-is: Streamly/Test/Internal/Prelude.hs
422 js-sources: jsbits/clock.js
427 , QuickCheck >= 2.10 && < 2.14
428 , hspec >= 2.0 && < 3
429 default-language: Haskell2010
431test-suite pure-streams-base
433 type: exitcode-stdio-1.0
434 main-is: PureStreams.hs
439 , hspec >= 2.0 && < 3
440 default-language: Haskell2010
442test-suite pure-streams-streamly
444 type: exitcode-stdio-1.0
445 main-is: PureStreams.hs
447 cpp-options: -DUSE_STREAMLY_LIST
451 , hspec >= 2.0 && < 3
452 default-language: Haskell2010
456 type: exitcode-stdio-1.0
458 js-sources: jsbits/clock.js
463 , QuickCheck >= 2.10 && < 2.14
464 , hspec >= 2.0 && < 3
467 transformers >= 0.4 && < 0.6
468 default-language: Haskell2010
472 type: exitcode-stdio-1.0
473 main-is: Streamly/Test/Array.hs
474 js-sources: jsbits/clock.js
476 cpp-options: -DTEST_ARRAY
480 , QuickCheck >= 2.10 && < 2.14
481 , hspec >= 2.0 && < 3
484 transformers >= 0.4 && < 0.6
485 default-language: Haskell2010
487test-suite internal-data-fold-test
489 type: exitcode-stdio-1.0
490 main-is: Streamly/Test/Internal/Data/Fold.hs
491 js-sources: jsbits/clock.js
496 , hspec >= 2.0 && < 3
497 , QuickCheck >= 2.10 && < 2.14
498 default-language: Haskell2010
500test-suite data-array-test
502 type: exitcode-stdio-1.0
503 main-is: Streamly/Test/Array.hs
504 js-sources: jsbits/clock.js
509 , QuickCheck >= 2.10 && < 2.14
510 , hspec >= 2.0 && < 3
513 transformers >= 0.4 && < 0.6
514 default-language: Haskell2010
516test-suite smallarray-test
518 type: exitcode-stdio-1.0
519 main-is: Streamly/Test/Array.hs
520 js-sources: jsbits/clock.js
522 cpp-options: -DTEST_SMALL_ARRAY
526 , QuickCheck >= 2.10 && < 2.14
527 , hspec >= 2.0 && < 3
530 transformers >= 0.4 && < 0.6
531 default-language: Haskell2010
533test-suite primarray-test
535 type: exitcode-stdio-1.0
536 main-is: Streamly/Test/Array.hs
537 js-sources: jsbits/clock.js
539 cpp-options: -DTEST_PRIM_ARRAY
543 , QuickCheck >= 2.10 && < 2.14
544 , hspec >= 2.0 && < 3
547 transformers >= 0.4 && < 0.6
548 default-language: Haskell2010
550test-suite string-test
552 type: exitcode-stdio-1.0
554 js-sources: jsbits/clock.js
559 , QuickCheck >= 2.10 && < 2.14
560 , hspec >= 2.0 && < 3
563 transformers >= 0.4 && < 0.6
564 default-language: Haskell2010
568 type: exitcode-stdio-1.0
569 default-language: Haskell2010
571 js-sources: jsbits/clock.js
578 , clock >= 0.7.1 && < 0.9
579 , hspec >= 2.0 && < 3
580 , random >= 1.0.0 && < 2
586 type: exitcode-stdio-1.0
587 default-language: Haskell2010
594test-suite nested-loops
596 type: exitcode-stdio-1.0
597 default-language: Haskell2010
598 main-is: nested-loops.hs
603 , random >= 1.0.0 && < 2
605test-suite parallel-loops
607 type: exitcode-stdio-1.0
608 default-language: Haskell2010
609 main-is: parallel-loops.hs
614 , random >= 1.0.0 && < 2
616-------------------------------------------------------------------------------
618-------------------------------------------------------------------------------
620-- For linear, linear-async, linear-rate, nested and nested-concurrent
621-- you can pass the number of elements in the stream using the
622-- --stream-size option:
623-- $ cabal run linear -- --stream-size 1000000
626 import: bench-options
627 type: exitcode-stdio-1.0
628 hs-source-dirs: benchmark
630 other-modules: Streamly.Benchmark.Prelude, Common
634 , deepseq >= 1.4.1 && < 1.5
635 , random >= 1.0 && < 2.0
636 , gauge >= 0.2.4 && < 0.3
639 transformers >= 0.4 && < 0.6
641 build-depends: template-haskell >= 2.14 && < 2.16
642 , inspection-testing >= 0.4 && < 0.5
645 import: bench-options
646 type: exitcode-stdio-1.0
647 hs-source-dirs: benchmark
649 other-modules: NestedOps, Common
653 , deepseq >= 1.4.1 && < 1.5
654 , random >= 1.0 && < 2.0
655 , gauge >= 0.2.4 && < 0.3
658 transformers >= 0.4 && < 0.6
660benchmark nested-unfold
661 import: bench-options
662 type: exitcode-stdio-1.0
663 hs-source-dirs: benchmark
664 main-is: NestedUnfold.hs
665 other-modules: NestedUnfoldOps, Common
669 , deepseq >= 1.4.1 && < 1.5
670 , random >= 1.0 && < 2.0
671 , gauge >= 0.2.4 && < 0.3
674 transformers >= 0.4 && < 0.6
676benchmark unpinned-array
677 import: bench-options
678 type: exitcode-stdio-1.0
679 hs-source-dirs: benchmark
680 main-is: Streamly/Benchmark/Data/Array.hs
681 other-modules: Streamly.Benchmark.Data.ArrayOps
685 , deepseq >= 1.4.1 && < 1.5
686 , random >= 1.0 && < 2.0
687 , gauge >= 0.2.4 && < 0.3
690 transformers >= 0.4 && < 0.6
693 import: bench-options
694 type: exitcode-stdio-1.0
695 hs-source-dirs: benchmark
696 main-is: Streamly/Benchmark/Data/Prim/Array.hs
697 other-modules: Streamly.Benchmark.Data.Prim.ArrayOps
701 , deepseq >= 1.4.1 && < 1.5
702 , random >= 1.0 && < 2.0
703 , gauge >= 0.2.4 && < 0.3
706 transformers >= 0.4 && < 0.6
709 import: bench-options
710 type: exitcode-stdio-1.0
711 hs-source-dirs: benchmark
712 main-is: Streamly/Benchmark/Data/SmallArray.hs
713 other-modules: Streamly.Benchmark.Data.SmallArrayOps
717 , deepseq >= 1.4.1 && < 1.5
718 , random >= 1.0 && < 2.0
719 , gauge >= 0.2.4 && < 0.3
722 transformers >= 0.4 && < 0.6
725 import: bench-options
726 type: exitcode-stdio-1.0
727 hs-source-dirs: benchmark
729 other-modules: ArrayOps
733 , deepseq >= 1.4.1 && < 1.5
734 , random >= 1.0 && < 2.0
735 , gauge >= 0.2.4 && < 0.3
738 transformers >= 0.4 && < 0.6
741 import: bench-options
742 type: exitcode-stdio-1.0
743 -- A value of 400 works better for some benchmarks, however, it takes
744 -- extraordinary amount of time to compile with that.
745 -- ghc-options: -funfolding-use-threshold=150
746 hs-source-dirs: benchmark
748 other-modules: Streamly.Benchmark.FileIO.Array
749 , Streamly.Benchmark.FileIO.Stream
753 , gauge >= 0.2.4 && < 0.3
754 , typed-process >= 0.2.3 && < 0.3
755 , deepseq >= 1.4.1 && < 1.5
757 build-depends: template-haskell >= 2.14 && < 2.16
758 , inspection-testing >= 0.4 && < 0.5
760-------------------------------------------------------------------------------
761-- Threaded Benchmarks
762-------------------------------------------------------------------------------
764benchmark linear-async
765 import: bench-options-threaded
766 type: exitcode-stdio-1.0
767 hs-source-dirs: benchmark
768 main-is: LinearAsync.hs
769 other-modules: Streamly.Benchmark.Prelude, Common
773 , deepseq >= 1.4.1 && < 1.5
774 , random >= 1.0 && < 2.0
775 , gauge >= 0.2.4 && < 0.3
778 transformers >= 0.4 && < 0.6
780 build-depends: template-haskell >= 2.14 && < 2.16
781 , inspection-testing >= 0.4 && < 0.5
783benchmark nested-concurrent
784 import: bench-options-threaded
785 type: exitcode-stdio-1.0
786 hs-source-dirs: benchmark
787 main-is: NestedConcurrent.hs
788 other-modules: NestedOps, Common
792 , deepseq >= 1.4.1 && < 1.5
793 , random >= 1.0 && < 2.0
794 , gauge >= 0.2.4 && < 0.3
797 transformers >= 0.4 && < 0.6
800 import: bench-options-threaded
801 type: exitcode-stdio-1.0
802 hs-source-dirs: benchmark
804 other-modules: Streamly.Benchmark.Prelude, NestedOps, Common
808 , deepseq >= 1.4.1 && < 1.5
809 , random >= 1.0 && < 2.0
810 , gauge >= 0.2.4 && < 0.3
813 transformers >= 0.4 && < 0.6
815 build-depends: template-haskell >= 2.14 && < 2.16
816 , inspection-testing >= 0.4 && < 0.5
819 import: bench-options-threaded
820 type: exitcode-stdio-1.0
821 hs-source-dirs: benchmark
822 main-is: LinearRate.hs
823 other-modules: Streamly.Benchmark.Prelude, Common
827 , deepseq >= 1.4.1 && < 1.5
828 , random >= 1.0 && < 2.0
829 , gauge >= 0.2.4 && < 0.3
832 transformers >= 0.4 && < 0.6
834 build-depends: template-haskell >= 2.14 && < 2.16
835 , inspection-testing >= 0.4 && < 0.5
838 import: bench-options-threaded
839 type: exitcode-stdio-1.0
840 hs-source-dirs: benchmark
841 main-is: Concurrent.hs
847 , gauge >= 0.2.4 && < 0.3
851-------------------------------------------------------------------------------
852-- Internal benchmarks
853-------------------------------------------------------------------------------
856 import: bench-options
857 type: exitcode-stdio-1.0
858 hs-source-dirs: benchmark
859 main-is: BaseStreams.hs
860 other-modules: StreamDOps
869 , deepseq >= 1.4.1 && < 1.5
870 , random >= 1.0 && < 2.0
871 , gauge >= 0.2.4 && < 0.3
876 import: bench-options
877 hs-source-dirs: benchmark
878 main-is: NanoBenchmarks.hs
884 , gauge >= 0.2.4 && < 0.3
885 , random >= 1.0 && < 2.0
890 import: bench-options
891 type: exitcode-stdio-1.0
892 hs-source-dirs: benchmark
894 default-language: Haskell2010
900 , gauge >= 0.2.4 && < 0.3
901 , random >= 1.0 && < 2.0
906 default-language: Haskell2010
908 hs-source-dirs: benchmark
910 if flag(dev) && !flag(no-charts) && !impl(ghcjs)
914 , bench-show >= 0.3 && < 0.4
916 , transformers >= 0.4 && < 0.6
920-------------------------------------------------------------------------------
922-------------------------------------------------------------------------------
924executable SearchQuery
926 main-is: SearchQuery.hs
927 hs-source-dirs: examples
928 if (flag(examples) || flag(examples-sdl)) && !impl(ghcjs)
933 , http-conduit >= 2.2.2 && < 2.4
940 hs-source-dirs: examples
941 if flag(examples) || flag(examples-sdl)
946 , directory >= 1.3 && < 1.4
949 transformers >= 0.4 && < 0.6
955 main-is: MergeSort.hs
956 hs-source-dirs: examples
957 if flag(examples) || flag(examples-sdl)
962 , random >= 1.0.0 && < 2
969 hs-source-dirs: examples
970 if flag(examples) || flag(examples-sdl)
978 semigroups >= 0.18 && < 0.19
979 , transformers >= 0.4 && < 0.6
983executable CirclingSquare
985 main-is: CirclingSquare.hs
986 hs-source-dirs: examples
987 if flag(examples-sdl)
992 , SDL >= 0.6.5 && < 0.7
996executable ControlFlow
998 main-is: ControlFlow.hs
999 hs-source-dirs: examples
1000 if flag(examples) || flag(examples-sdl)
1004 , base >= 4.8 && < 5
1005 , exceptions >= 0.8 && < 0.11
1006 , transformers >= 0.4 && < 0.6
1007 , transformers-base >= 0.4 && < 0.5
1010 semigroups >= 0.18 && < 0.19
1016 main-is: HandleIO.hs
1017 hs-source-dirs: examples
1018 if flag(examples) || flag(examples-sdl)
1022 , base >= 4.8 && < 5
1026executable FileIOExamples
1028 main-is: FileIOExamples.hs
1029 hs-source-dirs: examples
1030 if flag(examples) || flag(examples-sdl)
1034 , base >= 4.8 && < 5
1038executable EchoServer
1040 main-is: EchoServer.hs
1041 hs-source-dirs: examples
1042 if (flag(examples) || flag(examples-sdl)) && !impl(ghcjs)
1046 , base >= 4.8 && < 5
1047 , network >= 2.6 && < 4
1050 transformers >= 0.4 && < 0.6
1054executable FileSinkServer
1056 main-is: FileSinkServer.hs
1057 hs-source-dirs: examples
1058 if (flag(examples) || flag(examples-sdl)) && !impl(ghcjs)
1062 , base >= 4.8 && < 5
1063 , network >= 2.6 && < 4
1066 transformers >= 0.4 && < 0.6
1070executable FromFileClient
1072 main-is: FromFileClient.hs
1073 hs-source-dirs: examples
1074 if (flag(examples) || flag(examples-sdl)) && !impl(ghcjs)
1078 , base >= 4.8 && < 5
1082executable WordClassifier
1084 main-is: WordClassifier.hs
1085 hs-source-dirs: examples
1086 if (flag(examples) || flag(examples-sdl)) && !impl(ghcjs)
1090 , base >= 4.8 && < 5
1091 , hashable >= 1.2 && < 1.4
1092 , unordered-containers >= 0.2 && < 0.3
1098 main-is: WordCount.hs
1099 hs-source-dirs: examples
1100 if (flag(examples) || flag(examples-sdl)) && !impl(ghcjs)
1104 , base >= 4.8 && < 5
1105 , vector >= 0.12 && < 0.13
1111 main-is: CamelCase.hs
1112 hs-source-dirs: examples
1113 if (flag(examples) || flag(examples-sdl)) && !impl(ghcjs)
1117 , base >= 4.8 && < 5
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list