Git Product home page Git Product logo

monifu's Introduction

Idiomatic Reactive Extensions for Scala and Scala.js.

Build Status Build Status License

Gitter

Overview

Monifu is a high-performance Scala / Scala.js library for composing asynchronous and event-based programs using observable sequences that are exposed as asynchronous streams, expanding on the observer pattern, strongly inspired by Reactive Extensions (Rx), but designed from the ground up for back-pressure and made to cleanly interact with Scala's standard library and compatible out-of-the-box with the Reactive Streams protocol.

Highlights:

  • zero dependencies
  • clean and user-friendly API, with the observer interface using Future for back-pressure purposes
  • Observable operators exposed in a way that's idiomatic to Scala
  • compatible with for-comprehensions
  • compatible with Scalaz
  • designed to be completely asynchronous - Rx operators that are blocking or that are not compatible with back-pressure semantics
    are not going to be supported
  • does not depend on any particular mechanism for asynchronous execution and can be made to work with threads, actors, event loops, or whatnot, running perfectly both on top of the JVM or in Node.js or the browser
  • really good test coverage as a project policy

Usage

See monifu-sample for a project exemplifying Monifu used both on the server and on the client.

Compatibility

Currently compiled for Scala 2.10.x, 2.11.x and Scala.js 0.6.x. Monifu's compatibility extends to the latest 2 major Scala versions and to the latest major Scala.js version. In other words support for Scala 2.10.x will be kept for as long as possible, but you should not rely on continued support long after Scala 2.12 is out.

Dependencies

The packages are published on Maven Central.

  • Current stable release is: 1.0-RC3

For the JVM

libraryDependencies += "org.monifu" %% "monifu" % "1.0-RC3"

For targeting Javascript runtimes with Scala.js

libraryDependencies += "org.monifu" %%% "monifu" % "1.0-RC3"

Example

In order for subscriptions to work, we need an implicit Scheduler imported in our context. A Scheduler inherits from Scala's own ExecutionContext and any ExecutionContext can be quickly converted into a Scheduler. And then you're off ...

// scala.concurrent.ExecutionContext.Implicits.global
// is being used under the hood
import monifu.concurrent.Implicits.globalScheduler

// or we can simply convert our own execution context
// import play.api.libs.concurrent.Execution.Implicits.defaultContext
// implicit val scheduler = Scheduler(defaultContext)

import concurrent.duration._
import monifu.reactive._

val subscription = Observable.intervalAtFixedRate(1.second)
  .take(10)
  .subscription(x => println(x))

We can then try out more complex things:

import monifu.concurrent.Implicits.globalScheduler
import play.api.libs.ws._
import monifu.reactive._

// emits an auto-incremented number, every second
Observable.interval(1.second)
  // drops the items emitted over the first 5 secs
  .dropByTimespan(5.seconds)
  // takes the first 100 emitted events  
  .take(100)
  // per second, makes requests and concatenates the results
  .flatMap(x => WS.request(s"http://some.endpoint.com/request?tick=$x").get())
  // filters only valid responses
  .filter(response => response.status == 200)
  // samples by 3 seconds, repeating previous results in case of nothing new
  .sampleRepeated(3.seconds)
  // processes response, selecting the body
  .map(response => response.body)
  // creates subscription, foreach response print it
  .foreach(x => println(x))

There's actually a lot more to Monifu.

Documentation

The documentation is a work in progress.

API Documentation

License

All code in this repository is licensed under the Apache License, Version 2.0. See LICENCE.txt.

Acknowledgements

YourKit supports the Monifu project with its full-featured Java Profiler. YourKit, LLC is the creator [YourKit Java Profiler](http://www.yourkit.com/java/profiler/index.jsp) and [YourKit .NET Profiler](http://www.yourkit.com/.net/profiler/index.jsp), innovative and intelligent tools for profiling Java and .NET applications.

Development of Monifu has been initiated by Eloquentix engineers, with Monifu being introduced at E.ON Connecting Energies, powering the next generation energy grid solutions.

monifu's People

Contributors

alexandru avatar aoprisan avatar creyer2 avatar flashingpumpkin avatar gitter-badger avatar

Watchers

 avatar  avatar  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.