Ultra-high performance reactive programming

Overview
________________________________
___   |/  /_  __ \_  ___/__  __/
__  /|_/ /_  / / /____ \__  /   
_  /  / / / /_/ /____/ /_  /    
/_/  /_/  \____/______/ /_/

Monadic streams for reactive programming

Greenkeeper badge

Build Status Join the chat at https://gitter.im/cujojs/most

Starting a new project?

Strongly consider starting with @most/core. It is the foundation of the upcoming most 2.0, has improved documentation, new features, better tree-shaking build characteristics, and simpler APIs. Updating from @most/core to most 2.0 will be non-breaking and straightforward.

Using most 1.x already on an existing project?

You can keep using most 1.x, and update to either @most/core or most 2.0 when you're ready. See the upgrade guide for more information.

What is it?

Most.js is a toolkit for reactive programming. It helps you compose asynchronous operations on streams of values and events, e.g. WebSocket messages, DOM events, etc, and on time-varying values, e.g. the "current value" of an <input>, without many of the hazards of side effects and mutable shared state.

It features an ultra-high performance, low overhead architecture, APIs for easily creating event streams from existing sources, like DOM events, and a small but powerful set of operations for merging, filtering, transforming, and reducing event streams and time-varying values.

Learn more

Simple example

Here's a simple program that displays the result of adding two inputs. The result is reactive and updates whenever either input changes.

First, the HTML fragment for the inputs and a place to display the live result:

<form>
	<input class="x"> + <input class="y"> = <span class="result"></span>
</form>

Using most.js to make it reactive:

import { fromEvent, combine } from 'most'

const xInput = document.querySelector('input.x')
const yInput = document.querySelector('input.y')
const resultNode = document.querySelector('.result')

const add = (x, y) => x + y

const toNumber = e => Number(e.target.value)

const renderResult = result => {
	resultNode.textContent = result
}

export const main = () => {
	// x represents the current value of xInput
	const x = fromEvent('input', xInput).map(toNumber)

	// y represents the current value of yInput
	const y = fromEvent('input', yInput).map(toNumber)

	// result is the live current value of adding x and y
	const result = combine(add, x, y)

	// Observe the result value by rendering it to the resultNode
	result.observe(renderResult)
}

More examples

You can find the example above and others in the Examples repo.

Get it

Requirements

Most requires ES6 Promise. You can use your favorite polyfill, such as creed, when, bluebird, es6-promise, etc. Using a polyfill can be especially beneficial on platforms that don't yet have good unhandled rejection reporting capabilities.

Install

As a module:

npm install --save most
// ES6
import { /* functions */ } from 'most'
// or
import * as most from 'most'
// ES5
var most = require('most')

As window.most:

bower install --save most
<script src="most/dist/most.js"></script>

As a library via cdn :

<!-- unminified -->
<script src="https://unpkg.com/most/dist/most.js"></script>
<!-- minified -->
<script src="https://unpkg.com/most/dist/most.min.js"></script>

Typescript support

Most.js works with typescript out of the box as it provides local typings that will be read when you import Most.js in your code. You do not need to manually link an external d.ts file in your tsconfig.

Most.js has a dependency on native Promises so a type definition for Promise must be available in your setup:

  • If your tsconfig is targeting ES6, you do not need to do anything as typescript will include a definition for Promise by default.
  • If your tsconfig is targeting ES5, you need to provide your own Promise definition. For instance es6-shim.d.ts

Interoperability

Promises/A+ Fantasy Land

Most.js streams are compatible with Promises/A+ and ES6 Promises. They also implement Fantasy Land and Static Land Semigroup, Monoid, Functor, Apply, Applicative, Chain and Monad.

Reactive Programming

Reactive programming is an important concept that provides a lot of advantages: it naturally handles asynchrony and provides a model for dealing with complex data and time flow while also lessening the need to resort to shared mutable state. It has many applications: interactive UIs and animation, client-server communication, robotics, IoT, sensor networks, etc.

Why most.js for Reactive Programming?

High performance

A primary focus of most.js is performance. The perf test results indicate that it is achieving its goals in this area. Our hope is that by publishing those numbers, and showing what is possible, other libs will improve as well.

Modular architecture

Most.js is highly modularized. It's internal Stream/Source/Sink architecture and APIs are simple, concise, and well defined. Combinators are implemented entirely in terms of that API, and don't need to use any private details. This makes it easy to implement new combinators externally (ie in contrib repos, for example) while also guaranteeing they can still be high performance.

Simplicity

Aside from making combinators less "obviously correct", complexity can also lead to performace and maintainability issues. We felt a simple implementation would lead to a more stable and performant lib overall.

Integration

Most.js integrates with language features, such as promises, iterators, generators, and asynchronous generators.

Promises

Promises are a natural compliment to asynchronous reactive streams. The relationship between synchronous "sequence" and "value" is clear, and the asynchronous analogue needs to be clear, too. By taking the notion of a sequence and a value and lifting them into the asynchronous world, it seems clear that reducing an asynchronous sequence should produce a promise. Hence, most.js uses promises when a single value is the natural synchronous analogue.

Most.js interoperates seamlessly with ES6 and Promises/A+ promises. For example, reducing a stream returns a promise for the final result:

import { from } from 'most'
// After 1 second, logs 10
from([1, 2, 3, 4])
	.delay(1000)
	.reduce((result, y) => result + y, 0)
	.then(result => console.log(result))

You can also create a stream from a promise:

import { fromPromise } from 'most'
// Logs "hello"
fromPromise(Promise.resolve('hello'))
	.observe(message => console.log(message))

Generators

Conceptually, generators allow you to write a function that acts like an iterable sequence. Generators support the standard ES6 Iterator interface, so they can be iterated over using ES6 standard for of or the iterator's next() API.

Most.js interoperates with ES6 generators and iterators. For example, you can create an event stream from any ES6 iterable:

import { from } from 'most'

function* allTheIntegers() {
	let i=0
	while(true) {
		yield i++
	}
}

// Log the first 100 integers
from(allTheIntegers())
	.take(100)
	.observe(x => console.log(x))

Asynchronous Generators

You can also create an event stream from an asynchronous generator, a generator that yields promises:

import { generate } from 'most'

function* allTheIntegers(interval) {
	let i=0
	while(true) {
		yield delayPromise(interval, i++)
	}
}

const delayPromise = (ms, value) =>
	new Promise(resolve => setTimeout(() => resolve(value), ms))

// Log the first 100 integers, at 1 second intervals
generate(allTheIntegers, 1000)
	.take(100)
	.observe(x => console.log(x))
Comments
  • Add initial Publisher impl for discussion

    Add initial Publisher impl for discussion

    For discussion. This is an imperative push adapter that makes for easier integration in situations where most.create might be clumsy (see #71), or where events may be emitted and observers may be added in the current call stack.

    opened by briancavalier 58
  • How to make an originating source stream with no starting data?

    How to make an originating source stream with no starting data?

    Summary

    How would you create a simple base stream for emitting arbitrary data that doesn't exist yet? All the examples in the documentation seem to begin with either a dom event, or an existing dataset. I found one very basic example on StackOverflow that seems to do more-or-less what I'm after, but I can't seem to locate the create method (maybe it doesn't exist anymore?).

    Happy to work directly with Stream if that's what I need to do, but again, can't find any documentation that demonstrates how this works beyond the raw API descriptions of Stream, Sink, Disposable, Scheduler. It would be nice to have at least one simple example that shows how these pieces fit together for those of us who are not already streaming masters.

    Would be even happier to use some "functional" judo to create it, if that's possible. I feel like maybe there's something here about the never stream merged or switched or something that could get me going, but I just can't come up with anything myself that even hints at a solution.

    Versions

    • most.js: 1.7.2

    Code to reproduce

    
    // something like this
    
    const log = x => console.log(x)
    
    const createStream = () => {
      // ??????
    }
    
    const myStream = createStream()
    myStream.observe(log) 
    myStream.next('some value')
    
    // log: 'some value'
    
    
    question 
    opened by skylize 45
  • Nested streams not closing

    Nested streams not closing

    It seems as though streams which are nested using flatMap are not closed out correctly. Code sample:

    var most = require('most'),
      jQuery = require('jquery'),
      socket = require('sockjs')('/api/ws'),
      client = require('stomp').over(socket),
      connect = jQuery.Deferred();
    
    client.connect({}, function() {
      connect.resolve();
    });
    
    function getResource(resource, headers) {
      return most.fromPromise(connect).flatMap(function() {
        return getSnapshot(resource, headers).flatMap(function(data) {
          return getUpdates(resource, data, headers);
        });
      });
    }
    
    function getSnapshot(resource, headers) {
      return stream('/resource/' + resource, headers)
        .take(1);
    }
    
    function getUpdates(resource, data, headers) {
      return stream('/topic/' + resource, headers)
        .startWith([])
        .scan(patch, data);
    }
    
    function patch(data, patch) {
      return jiff.patch(patch, data);
    }
    
    function stream(destination, headers) {
      return most.create(function(add) {
        var subscription = client.subscribe(destination, function(msg) {
          add(JSON.parse(msg.body));
        }, headers);
        return subscription.unsubscribe.bind(subscription);
      })
    }
    

    When running code such as:

    getResource('resource').take(1).observe(console.log.bind(console));
    

    I expect both streams which are created (getSnapshot and getUpdates) to be disposed of. Currently only the stream generated by getSnapshot is disposed of correctly while the stream generated by getUpdates remains un-disposed.

    bug 
    opened by victormoukhortov 43
  • How comes it so much faster than LoDash?

    How comes it so much faster than LoDash?

    Hi!

    I really impressed with the performance. Test results are just incredible! And I can fully accept than it much faster that other RP libs. Being author of one, I know how much stuff happen on each event dispatch, and theoretically it can be boiled down to a single function call.

    Still I don't understand how it can be faster, and so much faster, than LoDash, which doesn't care about asynchrony, multiple subscribers etc. Does Most do same job as LoDash, i.e. can we use Most instead of LoDash?

    Thanks for any insights!

    opened by rpominov 25
  • Update rollup to the latest version 🚀

    Update rollup to the latest version 🚀

    Version 0.46.0 of rollup just got published.

    Dependency rollup
    Current Version 0.45.2
    Type devDependency

    The version 0.46.0 is not covered by your current version range.

    Without accepting this pull request your project will work just like it did before. There might be a bunch of new features, fixes and perf improvements that the maintainers worked on for you though.

    I recommend you look into these changes and try to get onto the latest version of rollup. Given that you have a decent test suite, a passing build is a strong indicator that you can take advantage of these changes by merging the proposed change into your project. Otherwise this branch is a great starting point for you to work on the update.


    Commits

    The new version differs by 33 commits.

    • b159c46 -> v0.46.0
    • bb63174 get test passing
    • 17b2c49 merge master -> CodeTroopers-master
    • 0e1293d apply scope refactoring to TaggedTemplateExpression
    • 686e907 Merge branch 'tagged-template-expressions' of https://github.com/lukastaegert/rollup into lukastaegert-tagged-template-expressions
    • f64babd change message - options.format cannot be missing
    • 5bdb0cb Merge branch 'master' into tagged-template-expressions
    • 2395452 Merge pull request #1517 from lukastaegert/abolish-scope-parameters
    • 3cfb4d4 Merge branch 'master' into abolish-scope-parameters
    • bfeea43 Merge pull request #1498 from lukastaegert/master
    • 2656dbc Merge pull request #1497 from Andarist/fix/iife-namespaced-named
    • c63782e preserve semicolon if var decl is body of for loop
    • 11508c4 Merge branch 'semicolon-var-fix' of https://github.com/jeffjewiss/rollup into jeffjewiss-semicolon-var-fix
    • 1a3abf2 Merge pull request #1491 from rollup/coalesce-warnings
    • 9e481d8 fix intermittent test failures

    There are 33 commits in total.

    See the full diff

    Not sure how things should work exactly?

    There is a collection of frequently asked questions and of course you may always ask my humans.


    Your Greenkeeper Bot :palm_tree:

    greenkeeper 
    opened by greenkeeper[bot] 23
  • multicast seems to be unreliable

    multicast seems to be unreliable

    This issue is based on my comment here: https://github.com/cujojs/most/issues/207#issuecomment-194845872

    I have this stream which stops emitting events to all subscribers (some still get the event) when I add multicast:

    most.fromEvent('visibilitychange', document)
      .map(() => !document.hidden)
      .startWith(!document.hidden);
    

    I’m currently trying to reproduce a minimal test case for this. Interestingly adding forEach to the stream that stops receiving events makes it work again (with multicast).

    opened by maxhoffmann 22
  • Implement [Symbol.observable] for ES7 interop compliance

    Implement [Symbol.observable] for ES7 interop compliance

    Hey @briancavalier! I know you and @jhusain and I talked a few months ago about interop between reactive streaming libraries like this and I'm here to offer a little help bridging that gap.

    we've been working hard on the next version of RxJS, and we're getting closer. Part of that work was to try to adhere to the current ES7 Observable spec by @zenparsing. The part of particular interest there for this library is the [Symbol.observable]() method.

    Implementing [Symbol.observable]

    Really all that is involved with that is to add a [Symbol.observable]() method to your streaming type, and have it return any object with a subscribe(observer) method, and a [Symbol.observable]() method.

    The benefits here are:

    • interop between streaming libraries
    • makes your type usable with frameworks looking for that contract (Angular 2 is likely to have support for this, for example)
    • eventual interop with JavaScript core whenever ES7 Observable lands.

    I think a basic implementation might look like:

    [Symbol.observable]() {
      var self = this;
      return {
        subscribe(observer) {
          self.observe(observer.next.bind(observer))
            .then(observer.complete.bind(observer), observer.error.bind(observer));
        }
        [Symbol.observable]() { return this; }
      };
    }
    

    Consuming "lowercase-o" observables...

    On your end, you could implement something inside of your from method to handle any type with a [Symbol.observable] method on it. As a guineapig you can use @reactivex/rxjs over npm, if you choose. Again it's pretty basic. You'd just call [Symbol.observable]() then call subscribe(observer) on the returned object, where observer has next, error and complete methods.

    Other things...

    I've actively tried to make any monadic-bind-esque operator in RxJS Next support objects that implement Symbol.observable. This means, effectively that if you were to implement this, people could jump between Most.js and RxJS using flatMaps and switches, etc. I'll be reaching out to the Bacon.js community with the same information.

    opened by benlesh 20
  • chore(TS): update typescript definitions

    chore(TS): update typescript definitions

    Add typings for most/lib/disposable/* Add typings for most/lib/scheduler/* Add typings for most/lib/.js Add typings for mmost/lib/sink/ Update exports to ES2015

    opened by TylorS 18
  • Equivalent to Rx.Subject

    Equivalent to Rx.Subject

    Hello everyone, I'm new to most and I was wondering if there is an equivalent to Rx's Subject? In particular, I'm curious if there is a way for recreating Rx.ReplaySubject

    For some more information on what I'm trying to accomplish.

    I'm trying to rewrite Cycle.js using Most instead of RxJs. I haven't been able to find a way to recreate the circular dependency between Observables.

    In Cycle.js it's roughly like this (although a little more complex)

    const sinksProxy = new Rx.Subject()
    const sources = driverFn( sinkProxy )
    const sinks = application( sources )
    sinks.subscribe( value => sinksProxy.onNext(value) )
    

    Thanks in advance!

    opened by TylorS 18
  • Add new consumer stream

    Add new consumer stream "collect"

    I would like to propose a new stream called collect for the https://github.com/cujojs/most/blob/master/docs/api.md#consuming-streams category.

    It would be sugar for:

    stream.from([ 'apple', 'orange', 'banana' ])
    .reduce((xs, x) => { xs.push(x); return xs; }, [])
    .then(console.log) // [ 'apple', 'orange', 'banana' ]
    

    becomes:

    stream.from([ 'apple', 'orange', 'banana' ])
    .collect()
    .then(console.log) // [ 'apple', 'orange', 'banana' ]
    

    I have found the collect function useful in systems where there are inherit race conditions with getting data such that changes must be buffered and replayed in order after some async operation(s) complete.

    Put another way, collect helps use FRP for micro ad-hoc queue situations. Very loosely speaking this touches a bit on what CSP is/does where everything is channels fronting queues that block on write or read (with opt-in semantic customization ala Clojure's API).

    opened by jasonkuhrt 17
  • Promise polyfill should be injectable by loaders, instead of relying on global scope pollution

    Promise polyfill should be injectable by loaders, instead of relying on global scope pollution

    Most.js relies on ES6 Promises but does not offer a way to import a polyfill for them cleanly without polluting the global scope. This is important in particular when you are writing code that should integrate with third parties within one browser context.

    For AMD loaders this can be fixed by having Most.js resolve the global Promise through a module. A "most/promise" module could be defined as simply as

    define([], function() { return Promise });
    

    This module could then at a user's discretion be remapped using AMD map configuration to their own, user-defined module that can in turn provide a polyfill for Most.js to use, without requiring the user to pollute the global browser environment with a polyfill implementation written into window.Promise.

    Surely other loaders and bundlers support similar extension points.

    opened by rjgotten 16
  • chore(deps): bump express and buster

    chore(deps): bump express and buster

    Removes express. It's no longer used after updating ancestor dependency buster. These dependencies need to be updated together.

    Removes express

    Updates buster from 0.7.18 to 0.8.0

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • chore(deps): bump qs and buster

    chore(deps): bump qs and buster

    Bumps qs to 6.5.3 and updates ancestor dependency buster. These dependencies need to be updated together.

    Updates qs from 0.5.1 to 6.5.3

    Changelog

    Sourced from qs's changelog.

    6.5.3

    • [Fix] parse: ignore __proto__ keys (#428)
    • [Fix] utils.merge`: avoid a crash with a null target and a truthy non-array source
    • [Fix] correctly parse nested arrays
    • [Fix] stringify: fix a crash with strictNullHandling and a custom filter/serializeDate (#279)
    • [Fix] utils: merge: fix crash when source is a truthy primitive & no options are provided
    • [Fix] when parseArrays is false, properly handle keys ending in []
    • [Fix] fix for an impossible situation: when the formatter is called with a non-string value
    • [Fix] utils.merge: avoid a crash with a null target and an array source
    • [Refactor] utils: reduce observable [[Get]]s
    • [Refactor] use cached Array.isArray
    • [Refactor] stringify: Avoid arr = arr.concat(...), push to the existing instance (#269)
    • [Refactor] parse: only need to reassign the var once
    • [Robustness] stringify: avoid relying on a global undefined (#427)
    • [readme] remove travis badge; add github actions/codecov badges; update URLs
    • [Docs] Clean up license text so it’s properly detected as BSD-3-Clause
    • [Docs] Clarify the need for "arrayLimit" option
    • [meta] fix README.md (#399)
    • [meta] add FUNDING.yml
    • [actions] backport actions from main
    • [Tests] always use String(x) over x.toString()
    • [Tests] remove nonexistent tape option
    • [Dev Deps] backport from main

    6.5.2

    • [Fix] use safer-buffer instead of Buffer constructor
    • [Refactor] utils: module.exports one thing, instead of mutating exports (#230)
    • [Dev Deps] update browserify, eslint, iconv-lite, safer-buffer, tape, browserify

    6.5.1

    • [Fix] Fix parsing & compacting very deep objects (#224)
    • [Refactor] name utils functions
    • [Dev Deps] update eslint, @ljharb/eslint-config, tape
    • [Tests] up to node v8.4; use nvm install-latest-npm so newer npm doesn’t break older node
    • [Tests] Use precise dist for Node.js 0.6 runtime (#225)
    • [Tests] make 0.6 required, now that it’s passing
    • [Tests] on node v8.2; fix npm on node 0.6

    6.5.0

    • [New] add utils.assign
    • [New] pass default encoder/decoder to custom encoder/decoder functions (#206)
    • [New] parse/stringify: add ignoreQueryPrefix/addQueryPrefix options, respectively (#213)
    • [Fix] Handle stringifying empty objects with addQueryPrefix (#217)
    • [Fix] do not mutate options argument (#207)
    • [Refactor] parse: cache index to reuse in else statement (#182)
    • [Docs] add various badges to readme (#208)
    • [Dev Deps] update eslint, browserify, iconv-lite, tape
    • [Tests] up to node v8.1, v7.10, v6.11; npm v4.6 breaks on node < v1; npm v5+ breaks on node < v4
    • [Tests] add editorconfig-tools

    ... (truncated)

    Commits
    Maintainer changes

    This version was pushed to npm by ljharb, a new releaser for qs since your current version.


    Updates buster from 0.7.18 to 0.8.0

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • chore(deps): bump minimatch and buster

    chore(deps): bump minimatch and buster

    Bumps minimatch to 3.0.4 and updates ancestor dependency buster. These dependencies need to be updated together.

    Updates minimatch from 0.1.5 to 3.0.4

    Commits
    Maintainer changes

    This version was pushed to npm by isaacs, a new releaser for minimatch since your current version.


    Updates buster from 0.7.18 to 0.8.0

    Commits

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • chore(deps): bump hosted-git-info from 2.5.0 to 2.8.9

    chore(deps): bump hosted-git-info from 2.5.0 to 2.8.9

    Bumps hosted-git-info from 2.5.0 to 2.8.9.

    Changelog

    Sourced from hosted-git-info's changelog.

    2.8.9 (2021-04-07)

    Bug Fixes

    2.8.8 (2020-02-29)

    Bug Fixes

    • #61 & #65 addressing issues w/ url.URL implmentation which regressed node 6 support (5038b18), closes #66

    2.8.7 (2020-02-26)

    Bug Fixes

    • Do not attempt to use url.URL when unavailable (2d0bb66), closes #61 #62
    • Do not pass scp-style URLs to the WhatWG url.URL (f2cdfcf), closes #60

    2.8.6 (2020-02-25)

    2.8.5 (2019-10-07)

    Bug Fixes

    • updated pathmatch for gitlab (e8325b5), closes #51
    • updated pathmatch for gitlab (ffe056f)

    2.8.4 (2019-08-12)

    ... (truncated)

    Commits
    • 8d4b369 chore(release): 2.8.9
    • 29adfe5 fix: backport regex fix from #76
    • afeaefd chore(release): 2.8.8
    • 5038b18 fix: #61 & #65 addressing issues w/ url.URL implmentation which regressed nod...
    • 7440afa chore(release): 2.8.7
    • 2d0bb66 fix: Do not attempt to use url.URL when unavailable
    • f2cdfcf fix: Do not pass scp-style URLs to the WhatWG url.URL
    • e1b83df chore(release): 2.8.6
    • ff259a6 Ensure passwords in hosted Git URLs are correctly escaped
    • 624fd6f chore(release): 2.8.5
    • Additional commits viewable in compare view
    Maintainer changes

    This version was pushed to npm by nlf, a new releaser for hosted-git-info since your current version.


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • chore(deps): bump handlebars from 4.0.11 to 4.7.7

    chore(deps): bump handlebars from 4.0.11 to 4.7.7

    Bumps handlebars from 4.0.11 to 4.7.7.

    Changelog

    Sourced from handlebars's changelog.

    v4.7.7 - February 15th, 2021

    • fix weird error in integration tests - eb860c0
    • fix: check prototype property access in strict-mode (#1736) - b6d3de7
    • fix: escape property names in compat mode (#1736) - f058970
    • refactor: In spec tests, use expectTemplate over equals and shouldThrow (#1683) - 77825f8
    • chore: start testing on Node.js 12 and 13 - 3789a30

    (POSSIBLY) BREAKING CHANGES:

    • the changes from version 4.6.0 now also apply in when using the compile-option "strict: true". Access to prototype properties is forbidden completely by default, specific properties or methods can be allowed via runtime-options. See #1633 for details. If you are using Handlebars as documented, you should not be accessing prototype properties from your template anyway, so the changes should not be a problem for you. Only the use of undocumented features can break your build.

    That is why we only bump the patch version despite mentioning breaking changes.

    Commits

    v4.7.6 - April 3rd, 2020

    Chore/Housekeeping:

    Compatibility notes:

    • Restored Node.js compatibility

    Commits

    v4.7.5 - April 2nd, 2020

    Chore/Housekeeping:

    • Node.js version support has been changed to v6+ Reverted in 4.7.6

    Compatibility notes:

    • Node.js < v6 is no longer supported Reverted in 4.7.6

    Commits

    v4.7.4 - April 1st, 2020

    Chore/Housekeeping:

    Compatibility notes:

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Make subscribe callbacks optional in typings

    Make subscribe callbacks optional in typings

    Summary

    Update docs and typescript typings to reflect that methods on the Observer all are optional.

    Here is what is linked in the docs regarding the Observer: https://github.com/tc39/proposal-observable#observer

    Flow types seem to be correct already.

    https://github.com/cujojs/most/blob/bfed148f1bfd8bc06a972a2cb17599371d8da52f/src/index.js.flow#L50-L55

    Todo

    • [ ] ~Unit tests for new or changed APIs and/or functionality~
    • [x] Documentation, including examples
    opened by vlinder 0
Releases(1.7.2)
  • 1.7.2(Sep 25, 2017)

  • 1.7.1(Sep 18, 2017)

  • 1.7.0(Aug 28, 2017)

  • 1.6.2(Aug 21, 2017)

  • 1.6.1(Aug 13, 2017)

  • 1.6.0(Aug 12, 2017)

    • Make thru fully parametric in its return type, allowing functions that return other types, e.g. promises. (#473)
    • Fix issue where debounce was not disposing its upstream source (#472)
    Source code(tar.gz)
    Source code(zip)
  • 1.5.1(Aug 2, 2017)

  • 1.5.0(Jun 27, 2017)

  • 1.4.1(Jun 6, 2017)

  • 1.4.0(May 26, 2017)

  • 1.3.0(Apr 27, 2017)

  • 1.2.3(Apr 20, 2017)

    • Fix end condition where take, slice, and takeWhile disposed their underlying sources twice. (#426)
    • Loosen TypeScript type constraint for fromEvent so it can be used with EventEmitter in addition to DOM events. (#410)
    Source code(tar.gz)
    Source code(zip)
  • 1.2.2(Feb 12, 2017)

  • 1.2.1(Jan 16, 2017)

  • 1.2.0(Jan 13, 2017)

    • Improve from's performance when dealing with non-Array Iterables
    • Deprecate periodic's 2nd arg.
      • The preferred way to provide a specific value is constant(x, periodic(period)).
    • Deprecate some function/method aliases:
      • await - use awaitPromises
      • switch - use switchLatest
      • flatMap - use chain
      • flatMapEnd - use continueWith
      • flatMapError - use recoverWith
      • distinct - use skipRepeats
      • distinctBy - use skipRepeatsWith
      • takeUntil - use until
      • skipUntil - use since
    Source code(tar.gz)
    Source code(zip)
  • 1.1.1(Dec 1, 2016)

    • Fix ES Observable unsubscribe race condition. Unsubscribe allowed a micro-turn before preventing new events. That allowed events to sneak through under certain conditions. Unsubscribe now synchronously prevents further events.
    Source code(tar.gz)
    Source code(zip)
  • v1.1.0(Nov 12, 2016)

    Publicly exports the default Scheduler instance, and a Task implementation PropagateTask. For users of TypeScript, the definition file has been updated to reflect these additions.

    For third-party library developers you can now make the following changes.

    - import defaultScheduler from 'most/lib/scheduler/defaultScheduler'
    + import { defaultScheduler } from 'most';
    
    - import PropagateTask from 'most/lib/scheduler/PropagateTask'
    + import { PropagateTask } from 'most'; 
    
    Source code(tar.gz)
    Source code(zip)
  • 1.0.5(Nov 3, 2016)

    • Improve type of fromEvent to allow specific Event subtypes. Now, TS users can do:
    // evaluates to Stream<MouseEvent>
    const mouseEvents = fromEvent<MouseEvent>('mousemove', document.body) 
    

    See #350 for more info.

    Source code(tar.gz)
    Source code(zip)
  • 1.0.3(Sep 8, 2016)

  • v1.0.2(Sep 7, 2016)

    • Convert all imports and exports to ES2015 modules
    • Provide jsnext:main field in package.json for next-gen bundlers like rollup and webpack 2
    • Add missing Stream.from static method to fix ES Observable compatibility
    • Add static-land compatibility - https://github.com/mostjs-community/most-static-land
    Source code(tar.gz)
    Source code(zip)
  • 1.0.1(Aug 15, 2016)

  • 1.0.0(Jul 19, 2016)

    • Ensure backward compatibility with 0.19.7, except for removed deprecations (see below)
    • Align fromEvent's capture parameter default behavior with that of @most/dom-event
    • Improve and simplify Typescript definitions
    • Fix issue with Draft Observable interop which could cause it not to recognize non-most.js observables.
    • Remove deprecated methods and functions: create, cycle
      • For create, see @most/create

      • cycle was rarely used. You can create it easily if you need:

        const cycle = stream => stream.continueWith(() => cycle(stream))
        
    Source code(tar.gz)
    Source code(zip)
  • 0.19.7(May 29, 2016)

  • 0.19.6(May 24, 2016)

  • 0.19.5(May 22, 2016)

  • 0.19.4(May 17, 2016)

    • Fix some error handling cases in higher-order operations, like chain and concatMap, as well as continueWith.
    • Deprecate most.create. It will be moved to a separate, backward compatible package.
    • Simplify several operations and internals.
    • Update build and test tooling.
    Source code(tar.gz)
    Source code(zip)
  • 0.19.3(May 5, 2016)

    • Add stream.thru(), which allows adapting functional APIs to fluent style
    • Improve efficiency of combine()
    • Add throttle fusion. For example: stream.throttle(n).throttle(m) becomes stream.throttle(Math.max(m, n))
    • Experimental Add map/throttle commutation. For example, stream.map.throttle.map becomes stream.throttle.map.map, which is then fused into stream.throttle.map
    Source code(tar.gz)
    Source code(zip)
  • 0.19.2(May 3, 2016)

  • 0.19.1(May 2, 2016)

  • 0.19.0(Apr 27, 2016)

    • Have you see the new ascii art logo? It's pretty fast, too.
    • Improve performance of switch substantially.
    • Add fusion rules for skip, take, and slice. For example: stream.skip.take becomes stream.slice.
    • Experimental Add map/slice commutation. For example, stream.map.slice.map becomes stream.slice.map.map, which is then fused into stream.slice.map
    • Fix for recoverWith ending a stream too early.
    • Breaking change concatMap now applies its mapping function lazily. See the docs for more information and visuals. This should only be a breaking change for code that has made assumptions about when the mapping function will be called.
    Source code(tar.gz)
    Source code(zip)
Owner
The Javascript Architectural Toolkit
The Javascript Architectural Toolkit
Functional reactive programming library for TypeScript and JavaScript

Bacon.js A functional reactive programming lib for TypeScript JavaScript, written in TypeScript. Turns your event spaghetti into clean and declarative

baconjs 6.4k Jan 1, 2023
An ultra-high performance stream reader for browser and Node.js

QuickReader An ultra-high performance stream reader for browser and Node.js, easy-to-use, zero dependency. Install npm i quickreader Demo import {Quic

EtherDream 156 Nov 28, 2022
A reactive programming library for JavaScript

RxJS: Reactive Extensions For JavaScript RxJS 7 (beta) FOR 6.X PLEASE GO TO THE 6.x BRANCH Reactive Extensions Library for JavaScript. This is a rewri

ReactiveX 28.2k Dec 28, 2022
Functional reactive programming library for TypeScript and JavaScript

Bacon.js A functional reactive programming lib for TypeScript JavaScript, written in TypeScript. Turns your event spaghetti into clean and declarative

baconjs 6.4k Jan 1, 2023
This a programming training app, aimed to help OMRI's students learng the magic world of programming.

OMRI App (fe-omri-app) This a programming training app, aimed to help OMRI's students learng the magic world of programming. Install the dependencies

OMRI Tech 2 Nov 19, 2022
When a person that doesn't know how to create a programming language tries to create a programming language

Kochanowski Online Spróbuj Kochanowskiego bez konfiguracji projektu! https://mmusielik.xyz/projects/kochanowski Instalacja Stwórz nowy projekt przez n

Maciej Musielik 18 Dec 4, 2022
Cookbook Method is the process of learning a programming language by building up a repository of small programs that implement specific programming concepts.

CookBook - Hacktoberfest Find the book you want to read next! PRESENTED BY What is CookBook? A cookbook in the programming context is collection of ti

GDSC-NITH 16 Nov 17, 2022
danfo.js is an open source, JavaScript library providing high performance, intuitive, and easy to use data structures for manipulating and processing structured data.

Danfojs: powerful javascript data analysis toolkit What is it? Danfo.js is a javascript package that provides fast, flexible, and expressive data stru

JSdata 4k Dec 29, 2022
🏁 High performance subscription-based form state management for React

You build great forms, but do you know HOW users use your forms? Find out with Form Nerd! Professional analytics from the creator of React Final Form.

Final Form 7.2k Jan 7, 2023
A cross platform high-performance graphics system.

spritejs.org Spritejs is a cross platform high-performance graphics system, which can render graphics on web, node, desktop applications and mini-prog

null 5.1k Dec 24, 2022
Execute one command (or mount one Node.js middleware) and get an instant high-performance GraphQL API for your PostgreSQL database!

PostGraphile Instant lightning-fast GraphQL API backed primarily by your PostgreSQL database. Highly customisable and extensible thanks to incredibly

Graphile 11.7k Jan 4, 2023
Quasar Framework - Build high-performance VueJS user interfaces in record time

Quasar Framework Build high-performance VueJS user interfaces in record time: responsive Single Page Apps, SSR Apps, PWAs, Browser extensions, Hybrid

Quasar Framework 22.7k Jan 9, 2023
A high-performance, dependency-free library for animated filtering, sorting, insertion, removal and more

MixItUp 3 MixItUp is a high-performance, dependency-free library for animated DOM manipulation, giving you the power to filter, sort, add and remove D

Patrick Kunka 4.5k Dec 24, 2022
Quasar Framework - Build high-performance VueJS user interfaces in record time

Quasar Framework Build high-performance VueJS user interfaces in record time: responsive Single Page Apps, SSR Apps, PWAs, Browser extensions, Hybrid

Quasar Framework 22.6k Jan 3, 2023
A simple high-performance Redis message queue for Node.js.

RedisSMQ - Yet another simple Redis message queue A simple high-performance Redis message queue for Node.js. For more details about RedisSMQ design se

null 501 Dec 30, 2022
Mapbox Visual for Power BI - High performance, custom map visuals for Power BI dashboards

Mapbox Visual for Microsoft Power BI Make sense of your big & dynamic location data with the Mapbox Visual for Power BI. Quickly design high-performan

Mapbox 121 Nov 22, 2022
Lightweight, High Performance Particles in Canvas

Sparticles https://sparticlesjs.dev Lightweight, High Performance Particles in Canvas. For those occasions when you ?? just ?? gotta ?? have ?? sparkl

Simon Goellner 171 Dec 29, 2022
A set of high performance yield handlers for Bluebird coroutines

bluebird-co A set of high performance yield handlers for Bluebird coroutines. Description bluebird-co is a reimplementation of tj/co generator corouti

null 76 May 30, 2022