R. (Ramda) stands for standard functional toolkit.
Operator counterparts aren't and can't be fully equivalent.
"Kinda the same" – is the current definition.
The following projects, were created with different goals and tradeoffs in mind, so every comparison and analogy is subjective and can be argued. The presence of some operator is not necessary good, as well as the abscence is not necessary bad.
Note, that primitives differ for each library. In descriptions, we broadly refer to all the "observable primitives" as streams*, though, technically speaking, some of them are rather stream-like entities.
To find something, search for a term you know.
- KefirJS:
fromPromise - MostJS:
fromPromise - RxJS:
fromPromise - XStream:
fromPromise
- KefirJS:
fromEvents - MostJS:
fromEvent - RxJS:
fromEvent - XStream:
fromEvent
- KefirJS:
stream,fromCallback,fromNodeCallback,fromPoll - MostJS:
new Stream - RxJS:
new Observable,bindCallback,bindNodeCallback - XStream:
? (make a promise first)
Pay attention that Kefir's merge accepts arrays while others are variadic.
- KefirJS:
combine - MostJS:
combine - RxJS:
combineLatest - XStream:
combine
- KefirJS:
combine,sampledBy - MostJS:
sample,sampleWith - RxJS:
sample,withLatestFrom - XStream:
sampleCombine
- KefirJS:
flatMapConcat - MostJS:
concatMap - RxJS:
concatMap - XStream:
map + flattenSequentially
Create stream from non-stream values.
| KefirJS | MostJS | RxJS | XStream |
|---|---|---|---|
interval |
periodic |
interval + map |
periodic |
repeat |
of + R.range |
repeat |
of + R.range |
? |
iterate |
generate |
? |
? |
generate |
generate |
? |
Modify events one to one.
| KefirJS | MostJS | RxJS | XStream |
|---|---|---|---|
delay |
delay |
delay |
combine(delay(500)) |
– (map) |
timestamp |
timestamp |
– (map) |
Modify events * to *.
| MostJS | RxJS | XStream |
|---|---|---|
chain / flatMap |
flatMap |
map + flattenConcurrently |
map + switch |
switchMap / flatMapLatest |
map + flatten |
join |
mergeAll |
flatten |
loop |
scan + map |
fold + map |
– (custom) |
bufferWithCount |
? |
Skip events by predicate or signal.
| MostJS | RxJS | XStream |
|---|---|---|
skipRepeats |
distinctUntilChanged |
dropRepeats |
skipRepeatsWith |
– (scan) |
dropRepeats |
slice |
skip + take |
drop + take |
skipWhile |
skipWhile |
fold + filter + map |
takeWhile |
takeWhile |
filter + endWhen |
since / skipUntil |
skipUntil |
fold + filter + map |
until / takeUntil |
takeUntil |
filter + endWhen |
during |
window + take(1) |
? |
Combine multiple streams into single.
| MostJS | RxJS | XStream |
|---|---|---|
zip |
zip |
? |
concat |
concat |
concat |
ap |
combineLatest |
? |
Produce side effect for every event.
| MostJS | RxJS | XStream |
|---|---|---|
tap |
do / tap |
debug |
Operators which target end event somehow.
| MostJS | RxJS | XStream |
|---|---|---|
empty |
empty |
empty |
never |
never |
never |
continueWith |
? |
concat |
| MostJS | RxJS |
|---|---|
– (custom) |
amb / race |
| MostJS | RxJS |
|---|---|
– (custom) |
|
- Three primitives:
Observer,Observable,Subject. - Observables end on error.
- Provides API to handle errors.
- Does not provide API to handle ending.
- Two primitives:
StreamandProperty(like XStream). - Observables does not end on error (by default).
- Provides API to handle errors.
- Provides API to handle ending.
- One primitive:
Stream(+ community-driven). - Separate packages for subject-like and property-like primitives.
- Provides API to handle errors.
- Provides API to handle ending.
- Two primitives:
StreamandMemoryStream(like KefirJS). - Always multicast. A Stream is like an RxJS Subject.
- Streams end on error.
RxJS does not emit initial scan value as event (use startWith for that).
Rx.Observable.interval(100).map(x => 1)
.scan(add, 0);
.subscribe(console.log); // 1--2--3--...
Most.periodic(100, 1)
.scan(add, 0);
.observe(console.log); // 0--1--2--3--...startWith vs sampleWith vs continueWith + recoverWith vs skipRepeatsWith
(val vs none vs func vs stream)
tap is listed in "Transform" section.
startWith is listed in "Combine" section.
mergeAll is listed in "Combine" section.
distinct is not listed in "Filtering" section.
takeUntil is not listed in "Filtering" section.
just / return should be deprecated in favor of of.
fromArray should be deprecated in favor of from.
bacon-vs-kefir – BaconJS vs KefirJS API comparison
dataflows – web arch. dataflow comparison
stream-conversions – tool for cross-library stream conversions
https://twitter.com/rpominov/status/689566111734599683
R. (Ramda) stands for standard functional toolkit.
Operator counterparts aren't and can't be fully equivalent.
"Kinda the same" – is the current definition.
The following projects, were created with different goals and tradeoffs in mind, so every comparison and analogy is subjective and can be argued. The presence of some operator is not necessary good, as well as the abscence is not necessary bad.
Note, that primitives differ for each library. In descriptions, we broadly refer to all the "observable primitives" as streams*, though, technically speaking, some of them are rather stream-like entities.
To find something, search for a term you know.
- KefirJS:
fromPromise - MostJS:
fromPromise - RxJS:
fromPromise - XStream:
fromPromise
- KefirJS:
fromEvents - MostJS:
fromEvent - RxJS:
fromEvent - XStream:
fromEvent
- KefirJS:
stream,fromCallback,fromNodeCallback,fromPoll - MostJS:
new Stream - RxJS:
new Observable,bindCallback,bindNodeCallback - XStream:
? (make a promise first)
- KefirJS:
map - MostJS:
map,constant - RxJS:
map,mapTo - XStream:
map
- KefirJS:
filter - MostJS:
filter - RxJS:
filter - XStream:
filter
- KefirJS:
skip - MostJS:
skip - RxJS:
skip - XStream:
drop
- KefirJS:
take - MostJS:
take - RxJS:
take - XStream:
take
- KefirJS:
scan - MostJS:
scan - RxJS:
scan - XStream:
fold
- KefirJS:
merge - MostJS:
merge - RxJS:
merge - XStream:
merge
Pay attention that Kefir's merge accepts arrays while others are variadic.
- KefirJS:
combine - MostJS:
combine - RxJS:
combineLatest - XStream:
combine
- KefirJS:
combine,sampledBy - MostJS:
sample,sampleWith - RxJS:
sample,withLatestFrom - XStream:
sampleCombine
- KefirJS:
flatMapConcat - MostJS:
concatMap - RxJS:
concatMap - XStream:
map + flattenSequentially
Create stream from non-stream values.
| KefirJS | MostJS | RxJS | XStream |
|---|---|---|---|
interval |
periodic |
interval + map |
periodic |
repeat |
of + R.range |
repeat |
of + R.range |
? |
iterate |
generate |
? |
? |
generate |
generate |
? |
Modify events one to one.
| KefirJS | MostJS | RxJS | XStream |
|---|---|---|---|
delay |
delay |
delay |
combine(delay(500)) |
– (map) |
timestamp |
timestamp |
– (map) |
Modify events * to *.
| MostJS | RxJS | XStream |
|---|---|---|
chain / flatMap |
flatMap |
map + flattenConcurrently |
map + switch |
switchMap / flatMapLatest |
map + flatten |
join |
mergeAll |
flatten |
loop |
scan + map |
fold + map |
– (custom) |
bufferWithCount |
? |
Skip events by predicate or signal.
| MostJS | RxJS | XStream |
|---|---|---|
skipRepeats |
distinctUntilChanged |
dropRepeats |
skipRepeatsWith |
– (scan) |
dropRepeats |
slice |
skip + take |
drop + take |
skipWhile |
skipWhile |
fold + filter + map |
takeWhile |
takeWhile |
filter + endWhen |
since / skipUntil |
skipUntil |
fold + filter + map |
until / takeUntil |
takeUntil |
filter + endWhen |
during |
window + take(1) |
? |
Combine multiple streams into single.
| MostJS | RxJS | XStream |
|---|---|---|
zip |
zip |
? |
concat |
concat |
concat |
ap |
combineLatest |
? |
Produce side effect for every event.
| MostJS | RxJS | XStream |
|---|---|---|
tap |
do / tap |
debug |
Operators which target end event somehow.
| MostJS | RxJS | XStream |
|---|---|---|
empty |
empty |
empty |
never |
never |
never |
continueWith |
? |
concat |
| MostJS | RxJS |
|---|---|
– (custom) |
amb / race |
| MostJS | RxJS |
|---|---|
– (custom) |
|
- Three primitives:
Observer,Observable,Subject. - Observables end on error.
- Provides API to handle errors.
- Does not provide API to handle ending.
- Two primitives:
StreamandProperty(like XStream). - Observables does not end on error (by default).
- Provides API to handle errors.
- Provides API to handle ending.
- One primitive:
Stream(+ community-driven). - Separate packages for subject-like and property-like primitives.
- Provides API to handle errors.
- Provides API to handle ending.
- Two primitives:
StreamandMemoryStream(like KefirJS). - Always multicast. A Stream is like an RxJS Subject.
- Streams end on error.
RxJS does not emit initial scan value as event (use startWith for that).
Rx.Observable.interval(100).map(x => 1)
.scan(add, 0);
.subscribe(console.log); // 1--2--3--...
Most.periodic(100, 1)
.scan(add, 0);
.observe(console.log); // 0--1--2--3--...startWith vs sampleWith vs continueWith + recoverWith vs skipRepeatsWith
(val vs none vs func vs stream)
tap is listed in "Transform" section.
startWith is listed in "Combine" section.
mergeAll is listed in "Combine" section.
distinct is not listed in "Filtering" section.
takeUntil is not listed in "Filtering" section.
just / return should be deprecated in favor of of.
fromArray should be deprecated in favor of from.
bacon-vs-kefir – BaconJS vs KefirJS API comparison
dataflows – web arch. dataflow comparison
stream-conversions – tool for cross-library stream conversions