|  | @@
                    -1,229
                    +1,233 | 
            
        
    
    
    
        |  | 1 | import { PromiseOrValue } from "@implab/core-amd/interfaces"; | 
            
                
             | 1 | import { PromiseOrValue } from "@implab/core-amd/interfaces"; | 
    
    
        |  | 2 | import { isPromise } from "@implab/core-amd/safe"; | 
            
                
             | 2 | import { isPromise } from "@implab/core-amd/safe"; | 
    
    
        |  | 3 |  | 
            
                
             | 3 |  | 
    
    
        |  | 4 | /** | 
            
                
             | 4 | /** | 
    
    
        |  | 5 | * The interface for the consumer of an observable sequence | 
            
                
             | 5 | * The interface for the consumer of an observable sequence | 
    
    
        |  | 6 | */ | 
            
                
             | 6 | */ | 
    
    
        |  | 7 | export interface Observer<T> { | 
            
                
             | 7 | export interface Observer<T> { | 
    
    
        |  | 8 | /** | 
            
                
             | 8 | /** | 
    
    
        |  | 9 | * Called for the next element in the sequence | 
            
                
             | 9 | * Called for the next element in the sequence | 
    
    
        |  | 10 | */ | 
            
                
             | 10 | */ | 
    
    
        |  | 11 | next: (value: T) => void; | 
            
                
             | 11 | next: (value: T) => void; | 
    
    
        |  | 12 |  | 
            
                
             | 12 |  | 
    
    
        |  | 13 | /** | 
            
                
             | 13 | /** | 
    
    
        |  | 14 | * Called once when the error occurs in the sequence. | 
            
                
             | 14 | * Called once when the error occurs in the sequence. | 
    
    
        |  | 15 | */ | 
            
                
             | 15 | */ | 
    
    
        |  | 16 | error: (e: unknown) => void; | 
            
                
             | 16 | error: (e: unknown) => void; | 
    
    
        |  | 17 |  | 
            
                
             | 17 |  | 
    
    
        |  | 18 | /** | 
            
                
             | 18 | /** | 
    
    
        |  | 19 | * Called once at the end of the sequence. | 
            
                
             | 19 | * Called once at the end of the sequence. | 
    
    
        |  | 20 | */ | 
            
                
             | 20 | */ | 
    
    
        |  | 21 | complete: () => void; | 
            
                
             | 21 | complete: () => void; | 
    
    
        |  | 22 | } | 
            
                
             | 22 | } | 
    
    
        |  | 23 |  | 
            
                
             | 23 |  | 
    
    
        |  | 24 | /** | 
            
                
             | 24 | /** | 
    
    
        |  | 25 | * The group of functions to feed an observable. These methods are provided to | 
            
                
             | 25 | * The group of functions to feed an observable. These methods are provided to | 
    
    
        |  | 26 | * the producer to generate a stream of events. | 
            
                
             | 26 | * the producer to generate a stream of events. | 
    
    
        |  | 27 | */ | 
            
                
             | 27 | */ | 
    
    
        |  | 28 | export type Sink<T> = { | 
            
                
             | 28 | export type Sink<T> = { | 
    
    
        |  | 29 | /** | 
            
                
             | 29 | /** | 
    
    
        |  | 30 | * Call to send the next element in the sequence | 
            
                
             | 30 | * Call to send the next element in the sequence | 
    
    
        |  | 31 | */ | 
            
                
             | 31 | */ | 
    
    
        |  | 32 | next: (value: T) => void; | 
            
                
             | 32 | next: (value: T) => void; | 
    
    
        |  | 33 |  | 
            
                
             | 33 |  | 
    
    
        |  | 34 | /** | 
            
                
             | 34 | /** | 
    
    
        |  | 35 | * Call to notify about the error occurred in the sequence. | 
            
                
             | 35 | * Call to notify about the error occurred in the sequence. | 
    
    
        |  | 36 | */ | 
            
                
             | 36 | */ | 
    
    
        |  | 37 | error: (e: unknown) => void; | 
            
                
             | 37 | error: (e: unknown) => void; | 
    
    
        |  | 38 |  | 
            
                
             | 38 |  | 
    
    
        |  | 39 | /** | 
            
                
             | 39 | /** | 
    
    
        |  | 40 | * Call to signal the end of the sequence. | 
            
                
             | 40 | * Call to signal the end of the sequence. | 
    
    
        |  | 41 | */ | 
            
                
             | 41 | */ | 
    
    
        |  | 42 | complete: () => void; | 
            
                
             | 42 | complete: () => void; | 
    
    
        |  | 43 |  | 
            
                
             | 43 |  | 
    
    
        |  | 44 | /** | 
            
                
             | 44 | /** | 
    
    
        |  | 45 | * Checks whether the sink is accepting new elements. It's safe to | 
            
                
             | 45 | * Checks whether the sink is accepting new elements. It's safe to | 
    
    
        |  | 46 | * send elements to the closed sink. | 
            
                
             | 46 | * send elements to the closed sink. | 
    
    
        |  | 47 | */ | 
            
                
             | 47 | */ | 
    
    
        |  | 48 | isClosed: () => boolean; | 
            
                
             | 48 | isClosed: () => boolean; | 
    
    
        |  | 49 | }; | 
            
                
             | 49 | }; | 
    
    
        |  | 50 |  | 
            
                
             | 50 |  | 
    
    
        |  | 51 | export type Producer<T> = (sink: Sink<T>) => (void | (() => void)); | 
            
                
             | 51 | export type Producer<T> = (sink: Sink<T>) => (void | (() => void)); | 
    
    
        |  | 52 |  | 
            
                
             | 52 |  | 
    
    
        |  | 53 | export interface Unsubscribable { | 
            
                
             | 53 | export interface Unsubscribable { | 
    
    
        |  | 54 | unsubscribe(): void; | 
            
                
             | 54 | unsubscribe(): void; | 
    
    
        |  | 55 | } | 
            
                
             | 55 | } | 
    
    
        |  | 56 |  | 
            
                
             | 56 |  | 
    
    
        |  | 57 | export const isUnsubsribable = (v: unknown): v is Unsubscribable => | 
            
                
             | 57 | export const isUnsubsribable = (v: unknown): v is Unsubscribable => | 
    
    
        |  | 58 | v !== null && v !== undefined && typeof (v as Unsubscribable).unsubscribe === "function"; | 
            
                
             | 58 | v !== null && v !== undefined && typeof (v as Unsubscribable).unsubscribe === "function"; | 
    
    
        |  | 59 |  | 
            
                
             | 59 |  | 
    
    
        |  | 60 | export const isSubsribable = <T = unknown>(v: unknown): v is Subscribable<T> => | 
            
                
             | 60 | export const isSubsribable = <T = unknown>(v: unknown): v is Subscribable<T> => | 
    
    
        |  | 61 | v !== null && v !== undefined && typeof (v as Subscribable<unknown>).subscribe === "function"; | 
            
                
             | 61 | v !== null && v !== undefined && typeof (v as Subscribable<unknown>).subscribe === "function"; | 
    
    
        |  | 62 |  | 
            
                
             | 62 |  | 
    
    
        |  | 63 | export interface Subscribable<T> { | 
            
                
             | 63 | export interface Subscribable<T> { | 
    
    
        |  | 64 | subscribe(consumer: Partial<Observer<T>>): Unsubscribable; | 
            
                
             | 64 | subscribe(consumer: Partial<Observer<T>>): Unsubscribable; | 
    
    
        |  | 65 | } | 
            
                
             | 65 | } | 
    
    
        |  | 66 |  | 
            
                
             | 66 |  | 
    
    
        |  | 67 | /** The observable source of items. */ | 
            
                
             | 67 | /** The observable source of items. */ | 
    
    
        |  | 68 | export interface Observable<T> extends Subscribable<T> { | 
            
                
             | 68 | export interface Observable<T> extends Subscribable<T> { | 
    
    
        |  | 69 | /** Transforms elements of the sequence with the specified mapper | 
            
                
             | 69 | /** Transforms elements of the sequence with the specified mapper | 
    
    
        |  | 70 | * | 
            
                
             | 70 | * | 
    
    
        |  | 71 | * @param mapper The mapper used to transform the values | 
            
                
             | 71 | * @param mapper The mapper used to transform the values | 
    
    
        |  | 72 | */ | 
            
                
             | 72 | */ | 
    
    
        |  | 73 | map<T2>(mapper: (value: T) => T2): Observable<T2>; | 
            
                
             | 73 | map<T2>(mapper: (value: T) => T2): Observable<T2>; | 
    
    
        |  | 74 |  | 
            
                
             | 74 |  | 
    
    
        |  | 75 | /** Filters elements of the sequence. The resulting sequence will | 
            
                
             | 75 | /** Filters elements of the sequence. The resulting sequence will | 
    
    
        |  | 76 | * contain only elements which match the specified predicate. | 
            
                
             | 76 | * contain only elements which match the specified predicate. | 
    
    
        |  | 77 | * | 
            
                
             | 77 | * | 
    
    
        |  | 78 | * @param predicate The filter predicate. | 
            
                
             | 78 | * @param predicate The filter predicate. | 
    
    
        |  | 79 | */ | 
            
                
             | 79 | */ | 
    
    
        |  | 80 | filter(predicate: (value: T) => boolean): Observable<T>; | 
            
                
             | 80 | filter(predicate: (value: T) => boolean): Observable<T>; | 
    
    
        |  | 81 |  | 
            
                
             | 81 |  | 
    
    
        |  | 82 | /** Applies accumulator to each value in the sequence and | 
            
                
             | 82 | /** Applies accumulator to each value in the sequence and | 
    
    
        |  | 83 | * emits the accumulated value for each source element | 
            
                
             | 83 | * emits the accumulated value for each source element | 
    
    
        |  | 84 | * | 
            
                
             | 84 | * | 
    
    
        |  | 85 | * @param accumulator | 
            
                
             | 85 | * @param accumulator | 
    
    
        |  | 86 | * @param initial | 
            
                
             | 86 | * @param initial | 
    
    
        |  | 87 | */ | 
            
                
             | 87 | */ | 
    
    
        |  | 88 | scan<A>(accumulator: (acc: A, value: T) => A, initial: A): Observable<A>; | 
            
                
             | 88 | scan<A>(accumulator: (acc: A, value: T) => A, initial: A): Observable<A>; | 
    
    
        |  | 89 |  | 
            
                
             | 89 |  | 
    
    
        |  | 90 | cat(...seq: Subscribable<T>[]): Observable<T>; | 
            
                
             | 90 | cat(...seq: Subscribable<T>[]): Observable<T>; | 
    
    
        |  |  |  | 
            
                
             | 91 | 
                    
                 | 
    
    
        |  |  |  | 
            
                
             | 92 | pipe<U>(f: (source: Observable<T>) => Producer<U>): Observable<U>; | 
    
    
        |  | 91 | } | 
            
                
             | 93 | } | 
    
    
        |  | 92 |  | 
            
                
             | 94 |  | 
    
    
        |  | 93 | const noop = () => { }; | 
            
                
             | 95 | const noop = () => { }; | 
    
    
        |  | 94 |  | 
            
                
             | 96 |  | 
    
    
        |  | 95 | const sink = <T>(consumer: Partial<Observer<T>>) => { | 
            
                
             | 97 | const sink = <T>(consumer: Partial<Observer<T>>) => { | 
    
    
        |  | 96 | const { next, error, complete } = consumer; | 
            
                
             | 98 | const { next, error, complete } = consumer; | 
    
    
        |  | 97 | return { | 
            
                
             | 99 | return { | 
    
    
        |  | 98 | next: next ? next.bind(consumer) : noop, | 
            
                
             | 100 | next: next ? next.bind(consumer) : noop, | 
    
    
        |  | 99 | error: error ? error.bind(consumer) : noop, | 
            
                
             | 101 | error: error ? error.bind(consumer) : noop, | 
    
    
        |  | 100 | complete: complete ? complete.bind(consumer) : noop, | 
            
                
             | 102 | complete: complete ? complete.bind(consumer) : noop, | 
    
    
        |  | 101 | isClosed: () => false | 
            
                
             | 103 | isClosed: () => false | 
    
    
        |  | 102 | }; | 
            
                
             | 104 | }; | 
    
    
        |  | 103 | }; | 
            
                
             | 105 | }; | 
    
    
        |  | 104 |  | 
            
                
             | 106 |  | 
    
    
        |  | 105 | /** Wraps the producer to handle tear down logic and subscription management | 
            
                
             | 107 | /** Wraps the producer to handle tear down logic and subscription management | 
    
    
        |  | 106 | * | 
            
                
             | 108 | * | 
    
    
        |  | 107 | * @param producer The producer to wrap | 
            
                
             | 109 | * @param producer The producer to wrap | 
    
    
        |  | 108 | * @returns The wrapper producer | 
            
                
             | 110 | * @returns The wrapper producer | 
    
    
        |  | 109 | */ | 
            
                
             | 111 | */ | 
    
    
        |  | 110 | const fuse = <T>(producer: Producer<T>) => ({ next, error, complete }: Sink<T>) => { | 
            
                
             | 112 | const fuse = <T>(producer: Producer<T>) => ({ next, error, complete }: Sink<T>) => { | 
    
    
        |  | 111 | let done = false; | 
            
                
             | 113 | let done = false; | 
    
    
        |  | 112 | let cleanup = noop; | 
            
                
             | 114 | let cleanup = noop; | 
    
    
        |  | 113 |  | 
            
                
             | 115 |  | 
    
    
        |  | 114 | const _fin = <A extends unknown[]>(fn: (...args: A) => void) => | 
            
                
             | 116 | const _fin = <A extends unknown[]>(fn: (...args: A) => void) => | 
    
    
        |  | 115 | (...args: A) => done ? | 
            
                
             | 117 | (...args: A) => done ? | 
    
    
        |  | 116 | void (0) : | 
            
                
             | 118 | void (0) : | 
    
    
        |  | 117 | (done = true, cleanup(), fn(...args)); | 
            
                
             | 119 | (done = true, cleanup(), fn(...args)); | 
    
    
        |  | 118 |  | 
            
                
             | 120 |  | 
    
    
        |  | 119 | const safeSink = { | 
            
                
             | 121 | const safeSink = { | 
    
    
        |  | 120 | next: (value: T) => { !done && next(value); }, | 
            
                
             | 122 | next: (value: T) => { !done && next(value); }, | 
    
    
        |  | 121 | error: _fin(error), | 
            
                
             | 123 | error: _fin(error), | 
    
    
        |  | 122 | complete: _fin(complete), | 
            
                
             | 124 | complete: _fin(complete), | 
    
    
        |  | 123 | isClosed: () => done | 
            
                
             | 125 | isClosed: () => done | 
    
    
        |  | 124 | }; | 
            
                
             | 126 | }; | 
    
    
        |  | 125 | cleanup = producer(safeSink) ?? noop; | 
            
                
             | 127 | cleanup = producer(safeSink) ?? noop; | 
    
    
        |  | 126 | return done ? | 
            
                
             | 128 | return done ? | 
    
    
        |  | 127 | (cleanup(), noop) : | 
            
                
             | 129 | (cleanup(), noop) : | 
    
    
        |  | 128 | _fin(noop); | 
            
                
             | 130 | _fin(noop); | 
    
    
        |  | 129 | }; | 
            
                
             | 131 | }; | 
    
    
        |  | 130 |  | 
            
                
             | 132 |  | 
    
    
        |  | 131 | const _observe = <T>(producer: Producer<T>): Observable<T> => ({ | 
            
                
             | 133 | const _observe = <T>(producer: Producer<T>): Observable<T> => ({ | 
    
    
        |  | 132 | subscribe: (consumer: Partial<Observer<T>>) => ({ | 
            
                
             | 134 | subscribe: (consumer: Partial<Observer<T>>) => ({ | 
    
    
        |  | 133 | unsubscribe: producer(sink(consumer)) ?? noop | 
            
                
             | 135 | unsubscribe: producer(sink(consumer)) ?? noop | 
    
    
        |  | 134 | }), | 
            
                
             | 136 | }), | 
    
    
        |  | 135 | map: (mapper) => _observe(({ next, ...rest }) => | 
            
                
             | 137 | map: (mapper) => _observe(({ next, ...rest }) => | 
    
    
        |  | 136 | producer({ | 
            
                
             | 138 | producer({ | 
    
    
        |  | 137 | next: next !== noop ? (v: T) => next(mapper(v)) : noop, | 
            
                
             | 139 | next: next !== noop ? (v: T) => next(mapper(v)) : noop, | 
    
    
        |  | 138 | ...rest | 
            
                
             | 140 | ...rest | 
    
    
        |  | 139 | }) | 
            
                
             | 141 | }) | 
    
    
        |  | 140 | ), | 
            
                
             | 142 | ), | 
    
    
        |  | 141 | filter: (predicate) => _observe(({ next, ...rest }) => | 
            
                
             | 143 | filter: (predicate) => _observe(({ next, ...rest }) => | 
    
    
        |  | 142 | producer({ | 
            
                
             | 144 | producer({ | 
    
    
        |  | 143 | next: next !== noop ? (v: T) => predicate(v) ? next(v) : void (0) : noop, | 
            
                
             | 145 | next: next !== noop ? (v: T) => predicate(v) ? next(v) : void (0) : noop, | 
    
    
        |  | 144 | ...rest | 
            
                
             | 146 | ...rest | 
    
    
        |  | 145 | }) | 
            
                
             | 147 | }) | 
    
    
        |  | 146 | ), | 
            
                
             | 148 | ), | 
    
    
        |  | 147 | scan: (accumulator, initial) => _observe(({ next, ...rest }) => { | 
            
                
             | 149 | scan: (accumulator, initial) => _observe(({ next, ...rest }) => { | 
    
    
        |  | 148 | let _acc = initial; | 
            
                
             | 150 | let _acc = initial; | 
    
    
        |  | 149 | return producer({ | 
            
                
             | 151 | return producer({ | 
    
    
        |  | 150 | next: next !== noop ? (v: T) => next(_acc = accumulator(_acc, v)) : noop, | 
            
                
             | 152 | next: next !== noop ? (v: T) => next(_acc = accumulator(_acc, v)) : noop, | 
    
    
        |  | 151 | ...rest | 
            
                
             | 153 | ...rest | 
    
    
        |  | 152 | }); | 
            
                
             | 154 | }); | 
    
    
        |  | 153 | }), | 
            
                
             | 155 | }), | 
    
    
        |  | 154 |  | 
            
                
             | 156 |  | 
    
    
        |  | 155 | cat: (...seq) => _observe(({ next, complete: final, ...rest }) => { | 
            
                
             | 157 | cat: (...seq) => _observe(({ next, complete: final, ...rest }) => { | 
    
    
        |  | 156 | let cleanup: () => void; | 
            
                
             | 158 | let cleanup: () => void; | 
    
    
        |  | 157 | const complete = () => { | 
            
                
             | 159 | const complete = () => { | 
    
    
        |  | 158 | const continuation = seq.shift(); | 
            
                
             | 160 | const continuation = seq.shift(); | 
    
    
        |  | 159 | if (continuation) { | 
            
                
             | 161 | if (continuation) { | 
    
    
        |  | 160 | // if we have a next sequence, subscribe to it | 
            
                
             | 162 | // if we have a next sequence, subscribe to it | 
    
    
        |  | 161 | const subscription = continuation.subscribe({ next, complete, ...rest }); | 
            
                
             | 163 | const subscription = continuation.subscribe({ next, complete, ...rest }); | 
    
    
        |  | 162 | cleanup = subscription.unsubscribe.bind(subscription); | 
            
                
             | 164 | cleanup = subscription.unsubscribe.bind(subscription); | 
    
    
        |  | 163 | } else { | 
            
                
             | 165 | } else { | 
    
    
        |  | 164 | // otherwise notify the consumer about completion | 
            
                
             | 166 | // otherwise notify the consumer about completion | 
    
    
        |  | 165 | final(); | 
            
                
             | 167 | final(); | 
    
    
        |  | 166 | } | 
            
                
             | 168 | } | 
    
    
        |  | 167 | }; | 
            
                
             | 169 | }; | 
    
    
        |  | 168 |  | 
            
                
             | 170 |  | 
    
    
        |  | 169 | cleanup = producer({ next, complete, ...rest }) ?? noop; | 
            
                
             | 171 | cleanup = producer({ next, complete, ...rest }) ?? noop; | 
    
    
        |  | 170 |  | 
            
                
             | 172 |  | 
    
    
        |  | 171 | return () => cleanup(); | 
            
                
             | 173 | return () => cleanup(); | 
    
    
        |  | 172 | }) | 
            
                
             | 174 | }), 
                    
                 | 
    
    
        |  |  |  | 
            
                
             | 175 |  | 
    
    
        |  |  |  | 
            
                
             | 176 | pipe: <U>(f: (source: Observable<T>) => Producer<U>) => observe(f(_observe(producer))) | 
    
    
        |  | 173 | }); | 
            
                
             | 177 | }); | 
    
    
        |  | 174 |  | 
            
                
             | 178 |  | 
    
    
        |  | 175 | export interface OrderUpdate<T> { | 
            
                
             | 179 | export interface OrderUpdate<T> { | 
    
    
        |  | 176 | /** The item is being updated */ | 
            
                
             | 180 | /** The item is being updated */ | 
    
    
        |  | 177 | item: T; | 
            
                
             | 181 | item: T; | 
    
    
        |  | 178 |  | 
            
                
             | 182 |  | 
    
    
        |  | 179 | /** The previous index of the item, -1 in case it is inserted */ | 
            
                
             | 183 | /** The previous index of the item, -1 in case it is inserted */ | 
    
    
        |  | 180 | prevIndex: number; | 
            
                
             | 184 | prevIndex: number; | 
    
    
        |  | 181 |  | 
            
                
             | 185 |  | 
    
    
        |  | 182 | /** The new index of the item, -1 in case it is deleted */ | 
            
                
             | 186 | /** The new index of the item, -1 in case it is deleted */ | 
    
    
        |  | 183 | newIndex: number; | 
            
                
             | 187 | newIndex: number; | 
    
    
        |  | 184 | } | 
            
                
             | 188 | } | 
    
    
        |  | 185 |  | 
            
                
             | 189 |  | 
    
    
        |  | 186 | interface ObservableResults<T> { | 
            
                
             | 190 | interface ObservableResults<T> { | 
    
    
        |  | 187 | /** | 
            
                
             | 191 | /** | 
    
    
        |  | 188 | * Allows observation of results | 
            
                
             | 192 | * Allows observation of results | 
    
    
        |  | 189 | */ | 
            
                
             | 193 | */ | 
    
    
        |  | 190 | observe(listener: (object: T, previousIndex: number, newIndex: number) => void, includeUpdates?: boolean): { | 
            
                
             | 194 | observe(listener: (object: T, previousIndex: number, newIndex: number) => void, includeUpdates?: boolean): { | 
    
    
        |  | 191 | remove(): void; | 
            
                
             | 195 | remove(): void; | 
    
    
        |  | 192 | }; | 
            
                
             | 196 | }; | 
    
    
        |  | 193 | } | 
            
                
             | 197 | } | 
    
    
        |  | 194 |  | 
            
                
             | 198 |  | 
    
    
        |  | 195 | interface Queryable<T, A extends unknown[]> { | 
            
                
             | 199 | interface Queryable<T, A extends unknown[]> { | 
    
    
        |  | 196 | query(...args: A): PromiseOrValue<T[]>; | 
            
                
             | 200 | query(...args: A): PromiseOrValue<T[]>; | 
    
    
        |  | 197 | } | 
            
                
             | 201 | } | 
    
    
        |  | 198 |  | 
            
                
             | 202 |  | 
    
    
        |  | 199 | export const isObservableResults = <T>(v: object): v is ObservableResults<T> => | 
            
                
             | 203 | export const isObservableResults = <T>(v: object): v is ObservableResults<T> => | 
    
    
        |  | 200 | v && (typeof (v as { observe?: unknown; }).observe === "function"); | 
            
                
             | 204 | v && (typeof (v as { observe?: unknown; }).observe === "function"); | 
    
    
        |  | 201 |  | 
            
                
             | 205 |  | 
    
    
        |  | 202 | export const observe = <T>(producer: Producer<T>) => _observe(fuse(producer)); | 
            
                
             | 206 | export const observe = <T>(producer: Producer<T>) => _observe(fuse(producer)); | 
    
    
        |  | 203 |  | 
            
                
             | 207 |  | 
    
    
        |  | 204 | export const empty = observe<never>(({ complete }) => complete()); | 
            
                
             | 208 | export const empty = observe<never>(({ complete }) => complete()); | 
    
    
        |  | 205 |  | 
            
                
             | 209 |  | 
    
    
        |  | 206 | export const query = <T, A extends unknown[]>(store: Queryable<T, A>) => | 
            
                
             | 210 | export const query = <T, A extends unknown[]>(store: Queryable<T, A>) => | 
    
    
        |  | 207 | (...args: A) => { | 
            
                
             | 211 | (...args: A) => { | 
    
    
        |  | 208 | return observe<OrderUpdate<T>>(({ next, complete, error }) => { | 
            
                
             | 212 | return observe<OrderUpdate<T>>(({ next, complete, error }) => { | 
    
    
        |  | 209 | try { | 
            
                
             | 213 | try { | 
    
    
        |  | 210 | const results = store.query(...args); | 
            
                
             | 214 | const results = store.query(...args); | 
    
    
        |  | 211 | if (isPromise(results)) { | 
            
                
             | 215 | if (isPromise(results)) { | 
    
    
        |  | 212 | results.then(items => items.forEach((item, newIndex) => next({ item, newIndex, prevIndex: -1 }))) | 
            
                
             | 216 | results.then(items => items.forEach((item, newIndex) => next({ item, newIndex, prevIndex: -1 }))) | 
    
    
        |  | 213 | .then(undefined, error); | 
            
                
             | 217 | .then(undefined, error); | 
    
    
        |  | 214 | } else { | 
            
                
             | 218 | } else { | 
    
    
        |  | 215 | results.forEach((item, newIndex) => next({ item, newIndex, prevIndex: -1 })); | 
            
                
             | 219 | results.forEach((item, newIndex) => next({ item, newIndex, prevIndex: -1 })); | 
    
    
        |  | 216 | } | 
            
                
             | 220 | } | 
    
    
        |  | 217 |  | 
            
                
             | 221 |  | 
    
    
        |  | 218 | if (isObservableResults<T>(results)) { | 
            
                
             | 222 | if (isObservableResults<T>(results)) { | 
    
    
        |  | 219 | const h = results.observe((item, prevIndex, newIndex) => next({ item, prevIndex, newIndex })); | 
            
                
             | 223 | const h = results.observe((item, prevIndex, newIndex) => next({ item, prevIndex, newIndex })); | 
    
    
        |  | 220 | return () => h.remove(); | 
            
                
             | 224 | return () => h.remove(); | 
    
    
        |  | 221 | } else { | 
            
                
             | 225 | } else { | 
    
    
        |  | 222 | complete(); | 
            
                
             | 226 | complete(); | 
    
    
        |  | 223 | } | 
            
                
             | 227 | } | 
    
    
        |  | 224 | } catch (err) { | 
            
                
             | 228 | } catch (err) { | 
    
    
        |  | 225 | error(err); | 
            
                
             | 229 | error(err); | 
    
    
        |  | 226 | } | 
            
                
             | 230 | } | 
    
    
        |  | 227 | }); | 
            
                
             | 231 | }); | 
    
    
        |  | 228 |  | 
            
                
             | 232 |  | 
    
    
        |  | 229 | }; | 
            
                
             | 233 | }; |