Giter VIP home page Giter VIP logo

fs2's Introduction

FS2: Functional Streams for Scala (previously 'Scalaz-Stream')

Build Status Gitter Chat

Quick links:

About the library

FS2 is a streaming I/O library. The design goals are compositionality, expressiveness, resource safety, and speed. Here's a simple example of its use:

import fs2.{io, text, Task}
import java.nio.file.Paths

def fahrenheitToCelsius(f: Double): Double =
  (f - 32.0) * (5.0/9.0)

val converter: Task[Unit] =
  io.file.readAll[Task](Paths.get("testdata/fahrenheit.txt"), 4096)
    .through(text.utf8Decode)
    .through(text.lines)
    .filter(s => !s.trim.isEmpty && !s.startsWith("//"))
    .map(line => fahrenheitToCelsius(line.toDouble).toString)
    .intersperse("\n")
    .through(text.utf8Encode)
    .through(io.file.writeAll(Paths.get("testdata/celsius.txt")))
    .run

// at the end of the universe...
val u: Unit = converter.unsafeRun()

This will construct a Task, converter, which reads lines incrementally from testdata/fahrenheit.txt, skipping blanklines and commented lines. It then parses temperatures in degrees fahrenheit, converts these to celsius, UTF-8 encodes the output and writes incrementally to testdata/celsius.txt, using constant memory. The input and output files will be closed in the event of normal termination or exceptions.

The library supports a number of other interesting use cases:

  • Zipping and merging of streams: A streaming computations may read from multiple sources in a streaming fashion, zipping or merging their elements using a arbitrary Tee. In general, clients have a great deal of flexibility in what sort of topologies they can define--source, sinks, and effectful channels are all first-class concepts in the library.
  • Dynamic resource allocation: A streaming computation may allocate resources dynamically (for instance, reading a list of files to process from a stream built off a network socket), and the library will ensure these resources get released in the event of normal termination or when errors occur.
  • Nondeterministic and concurrent processing: A computation may read from multiple input streams simultaneously, using whichever result comes back first, and a pipeline of transformation can allow for nondeterminism and queueing at each stage.

Documentation and getting help

Blog posts and other external resources are listed on the Additional Resources page.

Where to get the latest version

The 0.9 release is out and we recommend upgrading. You may want to first read the migration guide if you are upgrading from 0.8 or earlier. To get 0.9, add the following to your SBT build:

// available for Scala 2.11.8, 2.12.0-RC1
libraryDependencies += "co.fs2" %% "fs2-core" % "0.9.1"

// optional I/O library
libraryDependencies += "co.fs2" %% "fs2-io" % "0.9.1"

The fs2-core library is also supported on Scala.js:

// available for Scala 2.11.8, 2.12.0-RC1
libraryDependencies += "co.fs2" %%% "fs2-core" % "0.9.1"

API docs:

The previous stable release is 0.8.4 (source).

Projects using FS2

If you have a project you'd like to include in this list, either open a PR or let us know in the gitter channel and we'll add a link to it here.

  • doobie: Pure functional JDBC built on fs2.
  • http4s: Minimal, idiomatic Scala interface for HTTP services using fs2.
  • scodec-stream: A library for streaming binary decoding and encoding, built using fs2 and scodec.
  • streamz: A library that allows a Stream to consume from and produce to Apache Camel endpoints, Akka Persistence journals and snapshot stores and Akka Stream flows (reactive streams) with full back-pressure support.

Related projects

FS2 has evolved from earlier work on streaming APIs in Scala and Haskell and in Scala. Some influences:

Presentations, Blogs, etc.

See Additional resources.

fs2's People

Contributors

alissapajer avatar bmjames avatar bryce-anderson avatar chriscoffey avatar djspiewak avatar edwinchoi avatar fiadliel avatar fthomas avatar gflanagan avatar japgolly avatar jedesah avatar jessitron avatar kaiserpelagic avatar kanterov avatar larsrh avatar lukiano avatar mpilquist avatar mrairing avatar olivierblanvillain avatar pchiusano avatar pchlupacek avatar ppurang avatar radekm avatar readmecritic avatar runarorama avatar shawjef3 avatar shengc avatar xuwei-k avatar yilinwei avatar zaneli avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.