0.1.2 • Published 9 years ago

observable-helpers v0.1.2

Weekly downloads
2
License
MIT
Repository
github
Last release
9 years ago

observable-helpers

Helpers on top of es-observable

Need observable polyfill from core-js or zen-observable

Features:

Generic: map, throttle, timeoutPromise, ObserverBroker

Browser: create observable from DOMElement event, observable resolution object from window

Generic

// @flow
import {
    ObservableBroker,
    promiseToObservable
} from 'observable-helpers'
// ...
// @flow
/**
 * One observer controls many observables
 *
 * @example
 * ```js
 *  // @flow
 *  const broker = new ObservableBroker(() => {
 *      console.log('all listeners unsubscribed')
 *  })
 *  const unsub1 = broker.observable.subscribe({
 *      next(val: string): void {
 *          console.log(1, val)
 *      }
 *   )

 *  const unsub2 = broker.observable.subscribe({
 *      next(val: string): void {
 *          console.log(2, val)
 *      }
 *  })

 *  broker.next('val')
 *  // 1 val
 *  // 2 val

 *  unsub1()
 *  unsub2()
 *  // all listeners unsubscribed
 *  ```
 */
declare class ObserverBroker<V> {
    constructor(unsubscribe?: () => void): ObserverBroker<V>;
    observable: Observable<V, Error>;
    next(value: V): void;
    error(err: Error): void;
    complete(): void;
}

/**
 * Convert promise to observable
 *
 * @param Promise promise input promise
 * @param [boolean] thenIsNext - on then(data) generate next(data), complete(), on false - generate complete(data)
 *
 * @example
 * ```js
 * // flow
 * promiseToObservable(Promise.resolve('test'))
 *     .subscribe({
 *         complete(val: string): void {
 *             console.log('complete', val)
 *         }
 *     })
 * // outputs: complete test
 *
 * promiseToObservable(Promise.resolve('test'), true)
 *     .subscribe({
 *         next(val: string): void {
 *             console.log('next', val)
 *         },
 *         complete() {
 *             console.log('complete')
 *         }
 *     })
 * // outputs: next test
 * // complete
 * ```
 */
declare function promiseToObservable<V, E>(
    promise: Promise<V>,
    thenIsNext?: boolean
): Observable<V, E>;

/**
 * Throttle observable events
 *
 * @example
 * ```js
 * // @flow
 * throttle(new Observable((observer: SubscriptionObserver) => {
 *     observer.next('1')
 *     observer.next('2')
 * }), 100)
 *
 * // outputs: 2
 * ```
 */
declare function throttle<V, E>(src: Observable<V, E>, delay: number): Observable<V, E>;

/**
 * Map observable value
 *
 * @example
 * ```js
 * // @flow
 * mapObservable(new Observable((observer: SubscriptionObserver) => {
 *     observer.next(1)
 * }), (val: number) => val * 2)
 *
 * // outputs: 2
 * ```
 */
declare function mapObservable<V, R, E>(observable: Observable<V, E>, mapFn: (val: V) => R): Observable<R, E>;

/**
 * Auto-cancel promise after timeout
 *
 * @example
 * ```js
 * // @flow
 * timeoutPromise(new Promise((resolve) => {
 *     setTimeout(resolve, 10000)
 * }), 100)
 *     .catch((err) => console.log(err.message))
 *
 * // throws TimeoutError after 100 ms
 * ```
 */
declare function timeoutPromise<D>(promise: Promise<D>, timeout: number): Promise<D>;

/**
 * Resolution class with width and height
 */
declare class Resolution {
    width: number;
    height: number;
    constructor(width: number, height: number): void;
}

Browser

// @flow
import {
    observableFromEvent,
    createBrowserResolution
} from 'observable-helpers/browser'
// ...
// @flow
/**
 * Create observable from browser window event
 *
 * @example
 * ```js
 * // @flow
 * observableFromEvent(window, 'resize')
 * .subscribe({
 *     next(e: Event) => {
 *         console.log(window.width, window.height)
 *     }
 * })
 * ```
 */
declare function observableFromEvent<V, E>(
    target: Attacheable,
    eventName: string
): Observable<V, E>;

/**
 * Create observable resolution from window
 *
 * @example
 * ```js
 * // @flow
 *
 * // scan resolution each 100 ms
 * createBrowserResolution(window, 100)
 * 	.subscribe({
 * 	    next(r: Resolution) {
 * 	        console.log(r)
 * 	    }
 * 	})
 *
 *  // Outputs on resolution change: Resolution width: 1024, height: 768
 * ```
 */
declare function createBrowserResolution(
    target: {
        innerWidth: number,
        innerHeight: number
    },
    delay?: number
): Resolution & $ObservableObject;
0.1.2

9 years ago

0.1.1

9 years ago

0.1.0

9 years ago

0.0.14

9 years ago

0.0.13

9 years ago

0.0.11

10 years ago

0.0.10

10 years ago

0.0.9

10 years ago

0.0.8

10 years ago

0.0.7

10 years ago

0.0.6

10 years ago

0.0.5

10 years ago

0.0.4

10 years ago

0.0.3

10 years ago

0.0.2

10 years ago