Skip to content

lempiji/rx

Folders and files

NameName
Last commit message
Last commit date

Latest commit

d152c72 Â· Apr 1, 2023
Feb 27, 2019
Jun 23, 2019
Oct 10, 2022
Jun 14, 2020
Nov 7, 2015
Oct 10, 2022
Oct 10, 2022
Mar 10, 2018
Sep 14, 2016
Jun 16, 2019
Jun 16, 2019
Jun 16, 2019
Jun 16, 2019
Jun 16, 2019
Jun 16, 2019
May 3, 2019
Apr 1, 2023
Oct 10, 2022

Repository files navigation

Reactive Extensions for D Programming Language

Dub version MIT License Build Status codecov

Overview

This is a library like Rx.NET for asynchronous or event based programs, based on the concept of OutputRange.

The operators' name is based on std.algorithm and ReactiveX.

Example

import rx;
import std.conv : to;
import std.range : iota, put;

void main()
{
    // create own source of int
    auto subject = new SubjectObject!int;

    // define result array
    string[] result;

    // define pipeline and subscribe
    // sequence: source -> filter by even -> map to string -> join to result
    auto disposable = subject.filter!(n => n % 2 == 0).map!(o => to!string(o))
        .doSubscribe!(text => result ~= text);

    // set unsubscribe on exit
    // it is not necessary in this simple example,
    // but in many cases you should call dispose to prevent memory leaks.
    scope (exit)
        disposable.dispose();

    // put values to source. 
    put(subject, iota(10));

    // result is like this
    assert(result == ["0", "2", "4", "6", "8"]);
}

And more examples or Documents

Usage

Setting dependencies in dub.json

{
    ...
    "dependencies": {
        "rx": "~>0.10.0"
    }
}

or dub.sdl

dependency "rx" version="~>0.10.0"

Concepts

Basic interfaces

All operators are written using template and struct for optimization. this example is a binary interface like std.range.interfaces.

//module rx.disposable
interface Disposable
{
    void dispose();
}

//module rx.observer
interface Observer(E) : OutputRange!E
{
    //void put(E obj); //inherits from OutputRange!E
    void completed();
    void failure(Exception e);
}

//module rx.observable
interface Observable(E)
{
    alias ElementType = E;
    Disposable subscribe(Observer!E observer);
}

Supported Compilers

Supported compilers are dmd and ldc that latest 3 versions.

License

This library is under the MIT License.
Some code is borrowed from Rx.NET.

Contributing

Issue and PullRequest are welcome! 😃

Refer to CONTRIBUTING.md for details.

Development

Build and unittest

git clone https://github.com/lempiji/rx
cd rx
dub test

Update documents

Use https://github.com/adamdruppe/adrdox

Future work

  • generic observable factory
    • create, start, timer, interval
  • more subjects
    • publish, connectable
  • more algorithms
    • window, multicast
  • more test
  • more documents