@reactive-js/ix
Advanced tools
Comparing version 0.0.19 to 0.0.20
@@ -1,28 +0,9 @@ | ||
import { DisposableLike } from "@reactive-js/disposable"; | ||
import { OperatorLike } from "@reactive-js/pipe"; | ||
import { MulticastObservableLike, MulticastObservableResourceLike, ObservableLike } from "@reactive-js/rx"; | ||
import { SchedulerLike } from "@reactive-js/scheduler"; | ||
export interface AsyncIteratorLike<TReq, T> extends MulticastObservableLike<T> { | ||
dispatch(request: TReq): void; | ||
} | ||
export interface AsyncIteratorResourceLike<TReq, T> extends AsyncIteratorLike<TReq, T>, MulticastObservableResourceLike<T> { | ||
} | ||
export interface StateUpdaterLike<T> { | ||
(oldState: T): T; | ||
} | ||
export declare type StateStoreLike<T> = AsyncIteratorLike<StateUpdaterLike<T>, T>; | ||
export interface StateStoreResourceLike<T> extends StateStoreLike<T>, AsyncIteratorResourceLike<StateUpdaterLike<T>, T> { | ||
} | ||
export declare type EventEmitterLike<T> = AsyncIteratorLike<T, T>; | ||
export interface EventEmitterResourceLike<T> extends EventEmitterLike<T>, AsyncIteratorResourceLike<T, T> { | ||
} | ||
export declare const createAsyncIteratorResource: <TReq, T>(dispatch: (req: TReq) => void, observable: MulticastObservableLike<T>, disposable: DisposableLike) => AsyncIteratorResourceLike<TReq, T>; | ||
export declare const createEventEmitter: <T>() => EventEmitterResourceLike<T>; | ||
export declare const createReducerStore: <TAction, T>(initialState: T, reducer: (state: T, action: TAction) => T, scheduler: SchedulerLike, equals?: ((a: T, b: T) => boolean) | undefined) => AsyncIteratorResourceLike<TAction, T>; | ||
export declare const createStateStore: <T>(initialState: T, scheduler: SchedulerLike, equals?: ((a: T, b: T) => boolean) | undefined) => StateStoreResourceLike<T>; | ||
export declare const createPersistentStateStore: <T>(persistentStore: AsyncIteratorLike<T, T>, initialState: T, scheduler: SchedulerLike, equals?: ((a: T, b: T) => boolean) | undefined) => StateStoreResourceLike<T>; | ||
export interface AsyncIteratorOperatorLike<TSrcReq, TSrc, TReq, T> { | ||
(iter: AsyncIteratorLike<TSrcReq, TSrc>): AsyncIteratorLike<TReq, T>; | ||
} | ||
export declare const lift: <TReq, T, TA>(operator: OperatorLike<ObservableLike<T>, MulticastObservableLike<TA>>) => AsyncIteratorOperatorLike<TReq, T, TReq, TA>; | ||
export declare const liftReq: <TReq, T, TReqA>(operator: (dispatcher: (req: TReq) => void) => (ref: TReqA) => void) => AsyncIteratorOperatorLike<TReq, T, TReqA, T>; | ||
export { AsyncIteratorLike, AsyncIteratorOperatorLike, AsyncIteratorResourceLike, EventEmitterLike, EventEmitterResourceLike, StateStoreLike, StateStoreResourceLike, StateUpdaterLike, } from "./internal/interfaces"; | ||
export { createAsyncIteratorResource, createEventEmitter, createPersistentStateStore, } from "./internal/create"; | ||
export { empty } from "./internal/empty"; | ||
export { fromArray } from "./internal/fromArray"; | ||
export { fromIterable } from "./internal/fromIterable"; | ||
export { generate } from "./internal/generate"; | ||
export { lift, liftReq } from "./internal/lift"; | ||
export { reduce } from "./internal/reduce"; | ||
export { createReducerStore, createStateStore } from "./internal/reducerStore"; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
const pipe_1 = require("@reactive-js/pipe"); | ||
const rx_1 = require("@reactive-js/rx"); | ||
class AsyncIteratorResourceImpl { | ||
constructor(dispatch, observable, disposable) { | ||
this.dispatch = dispatch; | ||
this.observable = observable; | ||
this.disposable = disposable; | ||
} | ||
get isDisposed() { | ||
return this.disposable.isDisposed; | ||
} | ||
get subscriberCount() { | ||
return this.observable.subscriberCount; | ||
} | ||
add(disposable, ...disposables) { | ||
this.disposable.add(disposable, ...disposables); | ||
return this; | ||
} | ||
dispose() { | ||
this.disposable.dispose(); | ||
} | ||
remove(disposable, ...disposables) { | ||
this.disposable.remove(disposable, ...disposables); | ||
return this; | ||
} | ||
subscribe(subscriber) { | ||
this.observable.subscribe(subscriber); | ||
} | ||
} | ||
exports.createAsyncIteratorResource = (dispatch, observable, disposable) => new AsyncIteratorResourceImpl(dispatch, observable, disposable); | ||
exports.createEventEmitter = () => { | ||
const dispatcher = rx_1.createSubject(); | ||
return exports.createAsyncIteratorResource(dispatcher.onNext.bind(dispatcher), dispatcher, dispatcher); | ||
}; | ||
exports.createReducerStore = (initialState, reducer, scheduler, equals) => { | ||
const dispatcher = rx_1.createSubject(); | ||
const observable = pipe_1.pipe(dispatcher, rx_1.scan(reducer, () => initialState), rx_1.startWith(initialState), rx_1.distinctUntilChanged(equals), rx_1.share(scheduler, 1)); | ||
const store = exports.createAsyncIteratorResource(dispatcher.onNext.bind(dispatcher), observable, dispatcher); | ||
return store.add(pipe_1.pipe(store, rx_1.subscribe(scheduler))); | ||
}; | ||
const stateStoreReducer = (state, action) => action(state); | ||
exports.createStateStore = (initialState, scheduler, equals) => exports.createReducerStore(initialState, stateStoreReducer, scheduler, equals); | ||
exports.createPersistentStateStore = (persistentStore, initialState, scheduler, equals) => { | ||
const dispatcher = rx_1.createSubject(); | ||
const onPersistentStoreChangedStream = pipe_1.pipe(persistentStore, rx_1.onNext(v => dispatcher.onNext(_ => v)), rx_1.ignoreElements()); | ||
const stateObs = pipe_1.pipe(dispatcher, rx_1.scan((acc, next) => next(acc), () => initialState), rx_1.distinctUntilChanged(equals), rx_1.onNext(next => persistentStore.dispatch(next))); | ||
const observable = pipe_1.pipe(rx_1.merge(onPersistentStoreChangedStream, stateObs), rx_1.share(scheduler, 1)); | ||
return exports.createAsyncIteratorResource(dispatcher.onNext.bind(dispatcher), observable, dispatcher); | ||
}; | ||
class LiftedIteratorImpl { | ||
constructor(dispatcher, observable) { | ||
this.dispatcher = dispatcher; | ||
this.observable = observable; | ||
} | ||
get subscriberCount() { | ||
return this.observable.subscriberCount; | ||
} | ||
dispatch(req) { | ||
this.dispatcher(req); | ||
} | ||
subscribe(subscriber) { | ||
this.observable.subscribe(subscriber); | ||
} | ||
} | ||
const liftImpl = (operator, dispatchOperator) => iterator => { | ||
const observable = iterator.observable || iterator; | ||
const dispatcher = iterator.dispatcher || ((req) => iterator.dispatch(req)); | ||
const liftedObservable = operator !== undefined ? operator(observable) : observable; | ||
const liftedDispatcher = dispatchOperator !== undefined | ||
? dispatchOperator(dispatcher) | ||
: dispatcher; | ||
return new LiftedIteratorImpl(liftedDispatcher, liftedObservable); | ||
}; | ||
exports.lift = (operator) => liftImpl(operator, undefined); | ||
exports.liftReq = (operator) => liftImpl(undefined, operator); | ||
var create_1 = require("./internal/create"); | ||
exports.createAsyncIteratorResource = create_1.createAsyncIteratorResource; | ||
exports.createEventEmitter = create_1.createEventEmitter; | ||
exports.createPersistentStateStore = create_1.createPersistentStateStore; | ||
var empty_1 = require("./internal/empty"); | ||
exports.empty = empty_1.empty; | ||
var fromArray_1 = require("./internal/fromArray"); | ||
exports.fromArray = fromArray_1.fromArray; | ||
var fromIterable_1 = require("./internal/fromIterable"); | ||
exports.fromIterable = fromIterable_1.fromIterable; | ||
var generate_1 = require("./internal/generate"); | ||
exports.generate = generate_1.generate; | ||
var lift_1 = require("./internal/lift"); | ||
exports.lift = lift_1.lift; | ||
exports.liftReq = lift_1.liftReq; | ||
var reduce_1 = require("./internal/reduce"); | ||
exports.reduce = reduce_1.reduce; | ||
var reducerStore_1 = require("./internal/reducerStore"); | ||
exports.createReducerStore = reducerStore_1.createReducerStore; | ||
exports.createStateStore = reducerStore_1.createStateStore; | ||
//# sourceMappingURL=index.js.map |
@@ -1,28 +0,9 @@ | ||
import { DisposableLike } from "@reactive-js/disposable"; | ||
import { OperatorLike } from "@reactive-js/pipe"; | ||
import { MulticastObservableLike, MulticastObservableResourceLike, ObservableLike } from "@reactive-js/rx"; | ||
import { SchedulerLike } from "@reactive-js/scheduler"; | ||
export interface AsyncIteratorLike<TReq, T> extends MulticastObservableLike<T> { | ||
dispatch(request: TReq): void; | ||
} | ||
export interface AsyncIteratorResourceLike<TReq, T> extends AsyncIteratorLike<TReq, T>, MulticastObservableResourceLike<T> { | ||
} | ||
export interface StateUpdaterLike<T> { | ||
(oldState: T): T; | ||
} | ||
export declare type StateStoreLike<T> = AsyncIteratorLike<StateUpdaterLike<T>, T>; | ||
export interface StateStoreResourceLike<T> extends StateStoreLike<T>, AsyncIteratorResourceLike<StateUpdaterLike<T>, T> { | ||
} | ||
export declare type EventEmitterLike<T> = AsyncIteratorLike<T, T>; | ||
export interface EventEmitterResourceLike<T> extends EventEmitterLike<T>, AsyncIteratorResourceLike<T, T> { | ||
} | ||
export declare const createAsyncIteratorResource: <TReq, T>(dispatch: (req: TReq) => void, observable: MulticastObservableLike<T>, disposable: DisposableLike) => AsyncIteratorResourceLike<TReq, T>; | ||
export declare const createEventEmitter: <T>() => EventEmitterResourceLike<T>; | ||
export declare const createReducerStore: <TAction, T>(initialState: T, reducer: (state: T, action: TAction) => T, scheduler: SchedulerLike, equals?: ((a: T, b: T) => boolean) | undefined) => AsyncIteratorResourceLike<TAction, T>; | ||
export declare const createStateStore: <T>(initialState: T, scheduler: SchedulerLike, equals?: ((a: T, b: T) => boolean) | undefined) => StateStoreResourceLike<T>; | ||
export declare const createPersistentStateStore: <T>(persistentStore: AsyncIteratorLike<T, T>, initialState: T, scheduler: SchedulerLike, equals?: ((a: T, b: T) => boolean) | undefined) => StateStoreResourceLike<T>; | ||
export interface AsyncIteratorOperatorLike<TSrcReq, TSrc, TReq, T> { | ||
(iter: AsyncIteratorLike<TSrcReq, TSrc>): AsyncIteratorLike<TReq, T>; | ||
} | ||
export declare const lift: <TReq, T, TA>(operator: OperatorLike<ObservableLike<T>, MulticastObservableLike<TA>>) => AsyncIteratorOperatorLike<TReq, T, TReq, TA>; | ||
export declare const liftReq: <TReq, T, TReqA>(operator: (dispatcher: (req: TReq) => void) => (ref: TReqA) => void) => AsyncIteratorOperatorLike<TReq, T, TReqA, T>; | ||
export { AsyncIteratorLike, AsyncIteratorOperatorLike, AsyncIteratorResourceLike, EventEmitterLike, EventEmitterResourceLike, StateStoreLike, StateStoreResourceLike, StateUpdaterLike, } from "./internal/interfaces"; | ||
export { createAsyncIteratorResource, createEventEmitter, createPersistentStateStore, } from "./internal/create"; | ||
export { empty } from "./internal/empty"; | ||
export { fromArray } from "./internal/fromArray"; | ||
export { fromIterable } from "./internal/fromIterable"; | ||
export { generate } from "./internal/generate"; | ||
export { lift, liftReq } from "./internal/lift"; | ||
export { reduce } from "./internal/reduce"; | ||
export { createReducerStore, createStateStore } from "./internal/reducerStore"; |
@@ -1,76 +0,9 @@ | ||
import { pipe } from "@reactive-js/pipe"; | ||
import { createSubject, distinctUntilChanged, ignoreElements, merge, onNext, scan, share, startWith, subscribe, } from "@reactive-js/rx"; | ||
class AsyncIteratorResourceImpl { | ||
constructor(dispatch, observable, disposable) { | ||
this.dispatch = dispatch; | ||
this.observable = observable; | ||
this.disposable = disposable; | ||
} | ||
get isDisposed() { | ||
return this.disposable.isDisposed; | ||
} | ||
get subscriberCount() { | ||
return this.observable.subscriberCount; | ||
} | ||
add(disposable, ...disposables) { | ||
this.disposable.add(disposable, ...disposables); | ||
return this; | ||
} | ||
dispose() { | ||
this.disposable.dispose(); | ||
} | ||
remove(disposable, ...disposables) { | ||
this.disposable.remove(disposable, ...disposables); | ||
return this; | ||
} | ||
subscribe(subscriber) { | ||
this.observable.subscribe(subscriber); | ||
} | ||
} | ||
export const createAsyncIteratorResource = (dispatch, observable, disposable) => new AsyncIteratorResourceImpl(dispatch, observable, disposable); | ||
export const createEventEmitter = () => { | ||
const dispatcher = createSubject(); | ||
return createAsyncIteratorResource(dispatcher.onNext.bind(dispatcher), dispatcher, dispatcher); | ||
}; | ||
export const createReducerStore = (initialState, reducer, scheduler, equals) => { | ||
const dispatcher = createSubject(); | ||
const observable = pipe(dispatcher, scan(reducer, () => initialState), startWith(initialState), distinctUntilChanged(equals), share(scheduler, 1)); | ||
const store = createAsyncIteratorResource(dispatcher.onNext.bind(dispatcher), observable, dispatcher); | ||
return store.add(pipe(store, subscribe(scheduler))); | ||
}; | ||
const stateStoreReducer = (state, action) => action(state); | ||
export const createStateStore = (initialState, scheduler, equals) => createReducerStore(initialState, stateStoreReducer, scheduler, equals); | ||
export const createPersistentStateStore = (persistentStore, initialState, scheduler, equals) => { | ||
const dispatcher = createSubject(); | ||
const onPersistentStoreChangedStream = pipe(persistentStore, onNext(v => dispatcher.onNext(_ => v)), ignoreElements()); | ||
const stateObs = pipe(dispatcher, scan((acc, next) => next(acc), () => initialState), distinctUntilChanged(equals), onNext(next => persistentStore.dispatch(next))); | ||
const observable = pipe(merge(onPersistentStoreChangedStream, stateObs), share(scheduler, 1)); | ||
return createAsyncIteratorResource(dispatcher.onNext.bind(dispatcher), observable, dispatcher); | ||
}; | ||
class LiftedIteratorImpl { | ||
constructor(dispatcher, observable) { | ||
this.dispatcher = dispatcher; | ||
this.observable = observable; | ||
} | ||
get subscriberCount() { | ||
return this.observable.subscriberCount; | ||
} | ||
dispatch(req) { | ||
this.dispatcher(req); | ||
} | ||
subscribe(subscriber) { | ||
this.observable.subscribe(subscriber); | ||
} | ||
} | ||
const liftImpl = (operator, dispatchOperator) => iterator => { | ||
const observable = iterator.observable || iterator; | ||
const dispatcher = iterator.dispatcher || ((req) => iterator.dispatch(req)); | ||
const liftedObservable = operator !== undefined ? operator(observable) : observable; | ||
const liftedDispatcher = dispatchOperator !== undefined | ||
? dispatchOperator(dispatcher) | ||
: dispatcher; | ||
return new LiftedIteratorImpl(liftedDispatcher, liftedObservable); | ||
}; | ||
export const lift = (operator) => liftImpl(operator, undefined); | ||
export const liftReq = (operator) => liftImpl(undefined, operator); | ||
export { createAsyncIteratorResource, createEventEmitter, createPersistentStateStore, } from "./internal/create"; | ||
export { empty } from "./internal/empty"; | ||
export { fromArray } from "./internal/fromArray"; | ||
export { fromIterable } from "./internal/fromIterable"; | ||
export { generate } from "./internal/generate"; | ||
export { lift, liftReq } from "./internal/lift"; | ||
export { reduce } from "./internal/reduce"; | ||
export { createReducerStore, createStateStore } from "./internal/reducerStore"; | ||
//# sourceMappingURL=index.js.map |
@@ -1,29 +0,10 @@ | ||
import { DisposableLike } from "@reactive-js/disposable"; | ||
import { OperatorLike } from "@reactive-js/pipe"; | ||
import { MulticastObservableLike, MulticastObservableResourceLike, ObservableLike } from "@reactive-js/rx"; | ||
import { SchedulerLike } from "@reactive-js/scheduler"; | ||
export interface AsyncIteratorLike<TReq, T> extends MulticastObservableLike<T> { | ||
dispatch(request: TReq): void; | ||
} | ||
export interface AsyncIteratorResourceLike<TReq, T> extends AsyncIteratorLike<TReq, T>, MulticastObservableResourceLike<T> { | ||
} | ||
export interface StateUpdaterLike<T> { | ||
(oldState: T): T; | ||
} | ||
export declare type StateStoreLike<T> = AsyncIteratorLike<StateUpdaterLike<T>, T>; | ||
export interface StateStoreResourceLike<T> extends StateStoreLike<T>, AsyncIteratorResourceLike<StateUpdaterLike<T>, T> { | ||
} | ||
export declare type EventEmitterLike<T> = AsyncIteratorLike<T, T>; | ||
export interface EventEmitterResourceLike<T> extends EventEmitterLike<T>, AsyncIteratorResourceLike<T, T> { | ||
} | ||
export declare const createAsyncIteratorResource: <TReq, T>(dispatch: (req: TReq) => void, observable: MulticastObservableLike<T>, disposable: DisposableLike) => AsyncIteratorResourceLike<TReq, T>; | ||
export declare const createEventEmitter: <T>() => EventEmitterResourceLike<T>; | ||
export declare const createReducerStore: <TAction, T>(initialState: T, reducer: (state: T, action: TAction) => T, scheduler: SchedulerLike, equals?: ((a: T, b: T) => boolean) | undefined) => AsyncIteratorResourceLike<TAction, T>; | ||
export declare const createStateStore: <T>(initialState: T, scheduler: SchedulerLike, equals?: ((a: T, b: T) => boolean) | undefined) => StateStoreResourceLike<T>; | ||
export declare const createPersistentStateStore: <T>(persistentStore: AsyncIteratorLike<T, T>, initialState: T, scheduler: SchedulerLike, equals?: ((a: T, b: T) => boolean) | undefined) => StateStoreResourceLike<T>; | ||
export interface AsyncIteratorOperatorLike<TSrcReq, TSrc, TReq, T> { | ||
(iter: AsyncIteratorLike<TSrcReq, TSrc>): AsyncIteratorLike<TReq, T>; | ||
} | ||
export declare const lift: <TReq, T, TA>(operator: OperatorLike<ObservableLike<T>, MulticastObservableLike<TA>>) => AsyncIteratorOperatorLike<TReq, T, TReq, TA>; | ||
export declare const liftReq: <TReq, T, TReqA>(operator: (dispatcher: (req: TReq) => void) => (ref: TReqA) => void) => AsyncIteratorOperatorLike<TReq, T, TReqA, T>; | ||
export { AsyncIteratorLike, AsyncIteratorOperatorLike, AsyncIteratorResourceLike, EventEmitterLike, EventEmitterResourceLike, StateStoreLike, StateStoreResourceLike, StateUpdaterLike, } from "./internal/interfaces"; | ||
export { createAsyncIteratorResource, createEventEmitter, createPersistentStateStore, } from "./internal/create"; | ||
export { empty } from "./internal/empty"; | ||
export { fromArray } from "./internal/fromArray"; | ||
export { fromIterable } from "./internal/fromIterable"; | ||
export { generate } from "./internal/generate"; | ||
export { lift, liftReq } from "./internal/lift"; | ||
export { reduce } from "./internal/reduce"; | ||
export { createReducerStore, createStateStore } from "./internal/reducerStore"; | ||
//# sourceMappingURL=index.d.ts.map |
@@ -9,2 +9,3 @@ [@reactive-js/ix](README.md) | ||
* [AsyncIterableLike](interfaces/asynciterablelike.md) | ||
* [AsyncIteratorLike](interfaces/asynciteratorlike.md) | ||
@@ -29,4 +30,9 @@ * [AsyncIteratorOperatorLike](interfaces/asynciteratoroperatorlike.md) | ||
* [createStateStore](README.md#const-createstatestore) | ||
* [empty](README.md#const-empty) | ||
* [fromArray](README.md#const-fromarray) | ||
* [fromIterable](README.md#const-fromiterable) | ||
* [generate](README.md#const-generate) | ||
* [lift](README.md#const-lift) | ||
* [liftReq](README.md#const-liftreq) | ||
* [reduce](README.md#const-reduce) | ||
@@ -53,3 +59,3 @@ ## Type aliases | ||
▸ **createAsyncIteratorResource**<**TReq**, **T**>(`dispatch`: function, `observable`: MulticastObservableLike‹T›, `disposable`: DisposableLike): *[AsyncIteratorResourceLike](interfaces/asynciteratorresourcelike.md)‹TReq, T›* | ||
▸ **createAsyncIteratorResource**<**TReq**, **T**>(`operator`: ObservableOperatorLike‹TReq, T›, `scheduler`: SchedulerLike, `replayCount`: number): *[AsyncIteratorResourceLike](interfaces/asynciteratorresourcelike.md)‹TReq, T›* | ||
@@ -64,16 +70,8 @@ **Type parameters:** | ||
▪ **dispatch**: *function* | ||
Name | Type | Default | | ||
------ | ------ | ------ | | ||
`operator` | ObservableOperatorLike‹TReq, T› | - | | ||
`scheduler` | SchedulerLike | - | | ||
`replayCount` | number | 0 | | ||
▸ (`req`: TReq): *void* | ||
**Parameters:** | ||
Name | Type | | ||
------ | ------ | | ||
`req` | TReq | | ||
▪ **observable**: *MulticastObservableLike‹T›* | ||
▪ **disposable**: *DisposableLike* | ||
**Returns:** *[AsyncIteratorResourceLike](interfaces/asynciteratorresourcelike.md)‹TReq, T›* | ||
@@ -118,3 +116,3 @@ | ||
▸ **createReducerStore**<**TAction**, **T**>(`initialState`: T, `reducer`: function, `scheduler`: SchedulerLike, `equals?`: undefined | function): *[AsyncIteratorResourceLike](interfaces/asynciteratorresourcelike.md)‹TAction, T›* | ||
▸ **createReducerStore**<**TAction**, **T**>(`initialStateFactory`: function, `reducer`: function, `equals?`: undefined | function): *[AsyncIterableLike](interfaces/asynciterablelike.md)‹TAction, T›* | ||
@@ -129,4 +127,6 @@ **Type parameters:** | ||
▪ **initialState**: *T* | ||
▪ **initialStateFactory**: *function* | ||
▸ (): *T* | ||
▪ **reducer**: *function* | ||
@@ -143,7 +143,5 @@ | ||
▪ **scheduler**: *SchedulerLike* | ||
▪`Optional` **equals**: *undefined | function* | ||
**Returns:** *[AsyncIteratorResourceLike](interfaces/asynciteratorresourcelike.md)‹TAction, T›* | ||
**Returns:** *[AsyncIterableLike](interfaces/asynciterablelike.md)‹TAction, T›* | ||
@@ -154,3 +152,3 @@ ___ | ||
▸ **createStateStore**<**T**>(`initialState`: T, `scheduler`: SchedulerLike, `equals?`: undefined | function): *[StateStoreResourceLike](interfaces/statestoreresourcelike.md)‹T›* | ||
▸ **createStateStore**<**T**>(`initialState`: function, `equals?`: undefined | function): *[AsyncIterableLike](interfaces/asynciterablelike.md)‹[StateUpdaterLike](interfaces/stateupdaterlike.md)‹T›, T›* | ||
@@ -163,15 +161,93 @@ **Type parameters:** | ||
▪ **initialState**: *function* | ||
▸ (): *T* | ||
▪`Optional` **equals**: *undefined | function* | ||
**Returns:** *[AsyncIterableLike](interfaces/asynciterablelike.md)‹[StateUpdaterLike](interfaces/stateupdaterlike.md)‹T›, T›* | ||
___ | ||
### `Const` empty | ||
▸ **empty**<**TReq**, **T**>(): *[AsyncIterableLike](interfaces/asynciterablelike.md)‹TReq, T›* | ||
**Type parameters:** | ||
▪ **TReq** | ||
▪ **T** | ||
**Returns:** *[AsyncIterableLike](interfaces/asynciterablelike.md)‹TReq, T›* | ||
___ | ||
### `Const` fromArray | ||
▸ **fromArray**<**T**>(`values`: keyof T[]): *[AsyncIterableLike](interfaces/asynciterablelike.md)‹number | void, T›* | ||
**Type parameters:** | ||
▪ **T** | ||
**Parameters:** | ||
Name | Type | | ||
------ | ------ | | ||
`initialState` | T | | ||
`scheduler` | SchedulerLike | | ||
`equals?` | undefined | function | | ||
`values` | keyof T[] | | ||
**Returns:** *[StateStoreResourceLike](interfaces/statestoreresourcelike.md)‹T›* | ||
**Returns:** *[AsyncIterableLike](interfaces/asynciterablelike.md)‹number | void, T›* | ||
___ | ||
### `Const` fromIterable | ||
▸ **fromIterable**<**T**>(`iterable`: Iterable‹T›): *[AsyncIterableLike](interfaces/asynciterablelike.md)‹number | void, T›* | ||
**Type parameters:** | ||
▪ **T** | ||
**Parameters:** | ||
Name | Type | | ||
------ | ------ | | ||
`iterable` | Iterable‹T› | | ||
**Returns:** *[AsyncIterableLike](interfaces/asynciterablelike.md)‹number | void, T›* | ||
___ | ||
### `Const` generate | ||
▸ **generate**<**T**>(`generator`: function, `initialValue`: function): *[AsyncIterableLike](interfaces/asynciterablelike.md)‹number | void, T›* | ||
**Type parameters:** | ||
▪ **T** | ||
**Parameters:** | ||
▪ **generator**: *function* | ||
▸ (`acc`: T): *T* | ||
**Parameters:** | ||
Name | Type | | ||
------ | ------ | | ||
`acc` | T | | ||
▪ **initialValue**: *function* | ||
▸ (): *T* | ||
**Returns:** *[AsyncIterableLike](interfaces/asynciterablelike.md)‹number | void, T›* | ||
___ | ||
### `Const` lift | ||
▸ **lift**<**TReq**, **T**, **TA**>(`operator`: OperatorLike‹ObservableLike‹T›, MulticastObservableLike‹TA››): *[AsyncIteratorOperatorLike](interfaces/asynciteratoroperatorlike.md)‹TReq, T, TReq, TA›* | ||
▸ **lift**<**TReq**, **TA**, **TB**>(`operator`: ObservableOperatorLike‹TA, TB›, `scheduler`: SchedulerLike, `replay?`: undefined | number): *[AsyncIteratorOperatorLike](interfaces/asynciteratoroperatorlike.md)‹TReq, TA, TReq, TB›* | ||
@@ -182,6 +258,6 @@ **Type parameters:** | ||
▪ **T** | ||
▪ **TA** | ||
▪ **TB** | ||
**Parameters:** | ||
@@ -191,5 +267,7 @@ | ||
------ | ------ | | ||
`operator` | OperatorLike‹ObservableLike‹T›, MulticastObservableLike‹TA›› | | ||
`operator` | ObservableOperatorLike‹TA, TB› | | ||
`scheduler` | SchedulerLike | | ||
`replay?` | undefined | number | | ||
**Returns:** *[AsyncIteratorOperatorLike](interfaces/asynciteratoroperatorlike.md)‹TReq, T, TReq, TA›* | ||
**Returns:** *[AsyncIteratorOperatorLike](interfaces/asynciteratoroperatorlike.md)‹TReq, TA, TReq, TB›* | ||
@@ -200,11 +278,11 @@ ___ | ||
▸ **liftReq**<**TReq**, **T**, **TReqA**>(`operator`: function): *[AsyncIteratorOperatorLike](interfaces/asynciteratoroperatorlike.md)‹TReq, T, TReqA, T›* | ||
▸ **liftReq**<**TReqA**, **T**, **TReqB**>(`operator`: function): *[AsyncIteratorOperatorLike](interfaces/asynciteratoroperatorlike.md)‹TReqA, T, TReqB, T›* | ||
**Type parameters:** | ||
▪ **TReq** | ||
▪ **TReqA** | ||
▪ **T** | ||
▪ **TReqA** | ||
▪ **TReqB** | ||
@@ -221,3 +299,3 @@ **Parameters:** | ||
▸ (`req`: TReq): *void* | ||
▸ (`req`: TReqA): *void* | ||
@@ -228,5 +306,5 @@ **Parameters:** | ||
------ | ------ | | ||
`req` | TReq | | ||
`req` | TReqA | | ||
▸ (`ref`: TReqA): *void* | ||
▸ (`ref`: TReqB): *void* | ||
@@ -237,4 +315,39 @@ **Parameters:** | ||
------ | ------ | | ||
`ref` | TReqA | | ||
`ref` | TReqB | | ||
**Returns:** *[AsyncIteratorOperatorLike](interfaces/asynciteratoroperatorlike.md)‹TReq, T, TReqA, T›* | ||
**Returns:** *[AsyncIteratorOperatorLike](interfaces/asynciteratoroperatorlike.md)‹TReqA, T, TReqB, T›* | ||
___ | ||
### `Const` reduce | ||
▸ **reduce**<**TReq**, **TSrc**, **TAcc**>(`reducer`: function, `initial`: function, `scheduler`: SchedulerLike): *OperatorLike‹[AsyncIterableLike](interfaces/asynciterablelike.md)‹TReq, TSrc›, ObservableLike‹TAcc››* | ||
**Type parameters:** | ||
▪ **TReq** | ||
▪ **TSrc** | ||
▪ **TAcc** | ||
**Parameters:** | ||
▪ **reducer**: *function* | ||
▸ (`acc`: TAcc, `next`: TSrc): *ObservableLike‹ReduceRequestLike‹TReq, TAcc››* | ||
**Parameters:** | ||
Name | Type | | ||
------ | ------ | | ||
`acc` | TAcc | | ||
`next` | TSrc | | ||
▪ **initial**: *function* | ||
▸ (): *ReduceRequestLike‹TReq, TAcc›* | ||
▪ **scheduler**: *SchedulerLike* | ||
**Returns:** *OperatorLike‹[AsyncIterableLike](interfaces/asynciterablelike.md)‹TReq, TSrc›, ObservableLike‹TAcc››* |
{ | ||
"name": "@reactive-js/ix", | ||
"version": "0.0.19", | ||
"version": "0.0.20", | ||
"main": "dist/cjs/index.js", | ||
@@ -41,7 +41,13 @@ "module": "dist/esm5/index.js", | ||
"dependencies": { | ||
"@reactive-js/disposable": "^0.0.19", | ||
"@reactive-js/pipe": "^0.0.19", | ||
"@reactive-js/rx": "^0.0.19", | ||
"@reactive-js/scheduler": "^0.0.19" | ||
"@reactive-js/disposable": "^0.0.20", | ||
"@reactive-js/pipe": "^0.0.20", | ||
"@reactive-js/rx": "^0.0.20", | ||
"@reactive-js/scheduler": "^0.0.20" | ||
}, | ||
"devDependencies": { | ||
"@reactive-js/schedulers": "^0.0.20", | ||
"@types/jest": "^24.0.23", | ||
"jest": "^24.9.0", | ||
"ts-jest": "^24.1.0" | ||
}, | ||
"scripts": { | ||
@@ -52,8 +58,18 @@ "build": "yarn build-cjs & yarn build-esm5 & yarn build-types", | ||
"build-types": "tsc -p tsconfig.types.json", | ||
"docs": "typedoc --tsconfig tsconfig.doc.json" | ||
"docs": "typedoc --tsconfig tsconfig.doc.json", | ||
"test": "jest", | ||
"test-coverage": "jest --coverage" | ||
}, | ||
"jest": { | ||
"preset": "ts-jest", | ||
"globals": { | ||
"ts-jest": { | ||
"tsConfig": "./tsconfig.cjs.json" | ||
} | ||
} | ||
}, | ||
"publishConfig": { | ||
"access": "public" | ||
}, | ||
"gitHead": "fe0fe2eb19f54f103e64a4679266e3aea4c62194" | ||
"gitHead": "d78cd2b94c3a6a1a4eac41b8c9ca81bd9b98167d" | ||
} |
252
src/index.ts
@@ -1,232 +0,24 @@ | ||
import { DisposableOrTeardown, DisposableLike } from "@reactive-js/disposable"; | ||
import { OperatorLike, pipe } from "@reactive-js/pipe"; | ||
import { | ||
createSubject, | ||
distinctUntilChanged, | ||
ignoreElements, | ||
merge, | ||
MulticastObservableLike, | ||
MulticastObservableResourceLike, | ||
ObservableLike, | ||
onNext, | ||
scan, | ||
share, | ||
startWith, | ||
SubjectResourceLike, | ||
SubscriberLike, | ||
subscribe, | ||
} from "@reactive-js/rx"; | ||
import { SchedulerLike } from "@reactive-js/scheduler"; | ||
export { | ||
AsyncIteratorLike, | ||
AsyncIteratorOperatorLike, | ||
AsyncIteratorResourceLike, | ||
EventEmitterLike, | ||
EventEmitterResourceLike, | ||
StateStoreLike, | ||
StateStoreResourceLike, | ||
StateUpdaterLike, | ||
} from "./internal/interfaces"; | ||
/** @noInheritDoc */ | ||
export interface AsyncIteratorLike<TReq, T> extends MulticastObservableLike<T> { | ||
dispatch(request: TReq): void; | ||
} | ||
export { | ||
createAsyncIteratorResource, | ||
createEventEmitter, | ||
createPersistentStateStore, | ||
} from "./internal/create"; | ||
/** @noInheritDoc */ | ||
export interface AsyncIteratorResourceLike<TReq, T> | ||
extends AsyncIteratorLike<TReq, T>, | ||
MulticastObservableResourceLike<T> {} | ||
export interface StateUpdaterLike<T> { | ||
(oldState: T): T; | ||
} | ||
/** @noInheritDoc */ | ||
export type StateStoreLike<T> = AsyncIteratorLike<StateUpdaterLike<T>, T>; | ||
/** @noInheritDoc */ | ||
export interface StateStoreResourceLike<T> | ||
extends StateStoreLike<T>, | ||
AsyncIteratorResourceLike<StateUpdaterLike<T>, T> {} | ||
/** @noInheritDoc */ | ||
export type EventEmitterLike<T> = AsyncIteratorLike<T, T>; | ||
/** @noInheritDoc */ | ||
export interface EventEmitterResourceLike<T> | ||
extends EventEmitterLike<T>, | ||
AsyncIteratorResourceLike<T, T> {} | ||
class AsyncIteratorResourceImpl<TReq, T> | ||
implements AsyncIteratorResourceLike<TReq, T> { | ||
constructor( | ||
readonly dispatch: (req: TReq) => void, | ||
private readonly observable: MulticastObservableLike<T>, | ||
private readonly disposable: DisposableLike, | ||
) {} | ||
get isDisposed(): boolean { | ||
return this.disposable.isDisposed; | ||
} | ||
get subscriberCount(): number { | ||
return this.observable.subscriberCount; | ||
} | ||
add( | ||
disposable: DisposableOrTeardown, | ||
...disposables: DisposableOrTeardown[] | ||
) { | ||
this.disposable.add(disposable, ...disposables); | ||
return this; | ||
} | ||
dispose() { | ||
this.disposable.dispose(); | ||
} | ||
remove( | ||
disposable: DisposableOrTeardown, | ||
...disposables: DisposableOrTeardown[] | ||
) { | ||
this.disposable.remove(disposable, ...disposables); | ||
return this; | ||
} | ||
subscribe(subscriber: SubscriberLike<T>) { | ||
this.observable.subscribe(subscriber); | ||
} | ||
} | ||
export const createAsyncIteratorResource = <TReq, T>( | ||
dispatch: (req: TReq) => void, | ||
observable: MulticastObservableLike<T>, | ||
disposable: DisposableLike, | ||
): AsyncIteratorResourceLike<TReq, T> => | ||
new AsyncIteratorResourceImpl(dispatch, observable, disposable); | ||
export const createEventEmitter = <T>(): EventEmitterResourceLike<T> => { | ||
const dispatcher = createSubject(); | ||
return createAsyncIteratorResource( | ||
dispatcher.onNext.bind(dispatcher), | ||
dispatcher, | ||
dispatcher, | ||
); | ||
}; | ||
export const createReducerStore = <TAction, T>( | ||
initialState: T, | ||
reducer: (state: T, action: TAction) => T, | ||
scheduler: SchedulerLike, | ||
equals?: (a: T, b: T) => boolean, | ||
): AsyncIteratorResourceLike<TAction, T> => { | ||
const dispatcher = createSubject(); | ||
const observable = pipe( | ||
dispatcher, | ||
scan(reducer, () => initialState), | ||
startWith(initialState), | ||
distinctUntilChanged(equals), | ||
share(scheduler, 1), | ||
); | ||
const store = createAsyncIteratorResource( | ||
dispatcher.onNext.bind(dispatcher), | ||
observable, | ||
dispatcher, | ||
); | ||
return store.add(pipe(store, subscribe(scheduler))); | ||
}; | ||
const stateStoreReducer = <T>(state: T, action: StateUpdaterLike<T>) => | ||
action(state); | ||
export const createStateStore = <T>( | ||
initialState: T, | ||
scheduler: SchedulerLike, | ||
equals?: (a: T, b: T) => boolean, | ||
): StateStoreResourceLike<T> => | ||
createReducerStore(initialState, stateStoreReducer, scheduler, equals); | ||
export const createPersistentStateStore = <T>( | ||
persistentStore: AsyncIteratorLike<T, T>, | ||
initialState: T, | ||
scheduler: SchedulerLike, | ||
equals?: (a: T, b: T) => boolean, | ||
): StateStoreResourceLike<T> => { | ||
const dispatcher: SubjectResourceLike<StateUpdaterLike<T>> = createSubject(); | ||
const onPersistentStoreChangedStream = pipe( | ||
persistentStore, | ||
onNext(v => dispatcher.onNext(_ => v)), | ||
ignoreElements(), | ||
); | ||
const stateObs = pipe( | ||
dispatcher, | ||
scan( | ||
(acc: T, next: StateUpdaterLike<T>) => next(acc), | ||
() => initialState, | ||
), | ||
distinctUntilChanged(equals), | ||
onNext(next => persistentStore.dispatch(next)), | ||
); | ||
const observable = pipe( | ||
merge(onPersistentStoreChangedStream, stateObs), | ||
share(scheduler, 1), | ||
); | ||
return createAsyncIteratorResource( | ||
dispatcher.onNext.bind(dispatcher), | ||
observable, | ||
dispatcher, | ||
); | ||
}; | ||
export interface AsyncIteratorOperatorLike<TSrcReq, TSrc, TReq, T> { | ||
(iter: AsyncIteratorLike<TSrcReq, TSrc>): AsyncIteratorLike<TReq, T>; | ||
} | ||
class LiftedIteratorImpl<TReq, T> implements AsyncIteratorLike<TReq, T> { | ||
constructor( | ||
readonly dispatcher: (req: TReq) => void, | ||
readonly observable: MulticastObservableLike<T>, | ||
) {} | ||
get subscriberCount(): number { | ||
return this.observable.subscriberCount; | ||
} | ||
dispatch(req: TReq) { | ||
this.dispatcher(req); | ||
} | ||
subscribe(subscriber: SubscriberLike<T>) { | ||
this.observable.subscribe(subscriber); | ||
} | ||
} | ||
const liftImpl = <TReq, T, TReqA, TA>( | ||
operator?: OperatorLike<ObservableLike<T>, MulticastObservableLike<TA>>, | ||
dispatchOperator?: (dispatcher: (req: TReq) => void) => (req: TReqA) => void, | ||
): AsyncIteratorOperatorLike<TReq, T, TReqA, TA> => iterator => { | ||
// Cheat here. AsyncIteratorResourceImpl follows the same protocol, so | ||
// dynamically pull properties off of it. | ||
const observable: MulticastObservableLike<T> = | ||
(iterator as any).observable || iterator; | ||
const dispatcher: (req: TReq) => void = | ||
(iterator as any).dispatcher || ((req: any) => iterator.dispatch(req)); | ||
const liftedObservable = | ||
operator !== undefined ? operator(observable) : observable; | ||
const liftedDispatcher: (req: TReqA) => void = | ||
dispatchOperator !== undefined | ||
? dispatchOperator(dispatcher) | ||
: (dispatcher as any); | ||
return new LiftedIteratorImpl( | ||
liftedDispatcher, | ||
liftedObservable as MulticastObservableLike<TA>, | ||
); | ||
}; | ||
export const lift = <TReq, T, TA>( | ||
operator: OperatorLike<ObservableLike<T>, MulticastObservableLike<TA>>, | ||
): AsyncIteratorOperatorLike<TReq, T, TReq, TA> => | ||
liftImpl(operator, undefined); | ||
export const liftReq = <TReq, T, TReqA>( | ||
operator: (dispatcher: (req: TReq) => void) => (ref: TReqA) => void, | ||
): AsyncIteratorOperatorLike<TReq, T, TReqA, T> => | ||
liftImpl(undefined, operator); | ||
export { empty } from "./internal/empty"; | ||
export { fromArray } from "./internal/fromArray"; | ||
export { fromIterable } from "./internal/fromIterable"; | ||
export { generate } from "./internal/generate"; | ||
export { lift, liftReq } from "./internal/lift"; | ||
export { reduce } from "./internal/reduce"; | ||
export { createReducerStore, createStateStore } from "./internal/reducerStore"; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
618171
110
1212
4
1
+ Added@reactive-js/disposable@0.0.20(transitive)
+ Added@reactive-js/pipe@0.0.20(transitive)
+ Added@reactive-js/rx@0.0.20(transitive)
+ Added@reactive-js/scheduler@0.0.20(transitive)
- Removed@reactive-js/disposable@0.0.19(transitive)
- Removed@reactive-js/pipe@0.0.19(transitive)
- Removed@reactive-js/rx@0.0.19(transitive)
- Removed@reactive-js/scheduler@0.0.19(transitive)
Updated@reactive-js/pipe@^0.0.20
Updated@reactive-js/rx@^0.0.20