@mrpelz/observable 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @mrpelz/observable
2
+
3
+ Observable and atomic state and timing utils.
package/dist/main.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from './observable.js';
2
+ export * from './state.js';
3
+ export * from './timer.js';
4
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
package/dist/main.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from './observable.js';
2
+ export * from './state.js';
3
+ export * from './timer.js';
4
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,61 @@
1
+ export type Observer = {
2
+ remove: () => void;
3
+ };
4
+ export type MetaObserverCallback<T> = (value: T, changed: boolean) => void;
5
+ export type ObserverCallback<T> = (value: T, observer: Observer, changed: boolean) => void;
6
+ export type ProxyFn<T, S> = (input: T) => S;
7
+ export type AnyObservable<T> = Observable<T> | ReadOnlyObservable<T> | ProxyObservable<unknown, T> | ReadOnlyProxyObservable<unknown, T>;
8
+ export type AnyWritableObservable<T> = Observable<T> | ProxyObservable<unknown, T>;
9
+ export type AnyReadOnlyObservable<T> = ReadOnlyObservable<T> | ReadOnlyProxyObservable<unknown, T>;
10
+ export type ObservifyResult<T> = [ReadOnlyObservable<T | null>, () => void];
11
+ export type ObservifyGetter<T> = () => Promise<T | null>;
12
+ export declare class Observable<T> {
13
+ private readonly _observers;
14
+ private _value;
15
+ constructor(initialValue: T, observerCallback?: MetaObserverCallback<T>, forcedReport?: boolean);
16
+ get listeners(): number;
17
+ get value(): T;
18
+ set value(value: T);
19
+ observe(observerCallback: ObserverCallback<T>, forcedReport?: boolean): Observer;
20
+ }
21
+ export declare class ReadOnlyObservable<T> {
22
+ private readonly _observable;
23
+ constructor(observable: AnyObservable<T>);
24
+ get listeners(): number;
25
+ get value(): T;
26
+ observe(observerCallback: ObserverCallback<T>, forcedReport?: boolean): Observer;
27
+ }
28
+ export declare class ReadOnlyProxyObservable<T, S = T> {
29
+ private readonly _get;
30
+ private readonly _observable;
31
+ constructor(observable: AnyObservable<T>, get: ProxyFn<T, S>);
32
+ get listeners(): number;
33
+ get value(): S;
34
+ observe(observerCallback: ObserverCallback<S>, forcedReport?: boolean): Observer;
35
+ }
36
+ export declare const isWritableObservable: <T>(input: AnyObservable<T>) => input is AnyWritableObservable<T>;
37
+ export declare class ProxyObservable<T, S = T> {
38
+ static readonly doNotSet: unique symbol;
39
+ private readonly _get;
40
+ private readonly _observable;
41
+ private readonly _set;
42
+ private _suspend;
43
+ constructor(observable: AnyObservable<T>, get: ProxyFn<T, S>, set: ProxyFn<S, T | typeof ProxyObservable.doNotSet>);
44
+ get listeners(): number;
45
+ get value(): S;
46
+ set value(value: S);
47
+ observe(observerCallback: ObserverCallback<S>, forcedReport?: boolean): Observer;
48
+ }
49
+ export declare class ObservableGroup<T> extends Observable<T> {
50
+ protected readonly _observables: Set<AnyObservable<T>>;
51
+ constructor(initialValue: T, observables?: AnyObservable<T>[]);
52
+ get observables(): AnyObservable<T>[];
53
+ get values(): T[];
54
+ get value(): T;
55
+ set value(value: T);
56
+ protected _merge(): T;
57
+ }
58
+ export declare const isObservable: (input: unknown) => input is AnyObservable<any>;
59
+ export declare const isReadOnlyObservable: (input: unknown) => input is AnyReadOnlyObservable<any>;
60
+ export declare const observify: <T>(fn: ObservifyGetter<T>) => ObservifyResult<T>;
61
+ //# sourceMappingURL=observable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observable.d.ts","sourceRoot":"","sources":["../src/observable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ import { promiseGuard } from '@mrpelz/misc-utils/promise';
2
+ export class Observable {
3
+ _observers;
4
+ _value;
5
+ constructor(initialValue, observerCallback, forcedReport = true) {
6
+ this._value = initialValue;
7
+ this._observers = observerCallback
8
+ ? new Map([[observerCallback, forcedReport]])
9
+ : new Map();
10
+ }
11
+ get listeners() {
12
+ return this._observers.size;
13
+ }
14
+ get value() {
15
+ return this._value;
16
+ }
17
+ set value(value) {
18
+ const oldValue = this._value;
19
+ this._value = value;
20
+ const changed = this._value !== oldValue;
21
+ for (const [observer, forcedReport] of this._observers) {
22
+ if (!changed && !forcedReport)
23
+ continue;
24
+ observer(this._value, changed);
25
+ }
26
+ }
27
+ observe(observerCallback, forcedReport = false) {
28
+ let observer;
29
+ const metaObserverCallback = (value, changed) => {
30
+ observerCallback(value, observer, changed);
31
+ };
32
+ this._observers.set(metaObserverCallback, forcedReport);
33
+ observer = {
34
+ remove: () => this._observers.delete(metaObserverCallback),
35
+ };
36
+ return observer;
37
+ }
38
+ }
39
+ export class ReadOnlyObservable {
40
+ _observable;
41
+ constructor(observable) {
42
+ this._observable = observable;
43
+ }
44
+ get listeners() {
45
+ return this._observable.listeners;
46
+ }
47
+ get value() {
48
+ return this._observable.value;
49
+ }
50
+ observe(observerCallback, forcedReport = false) {
51
+ return this._observable.observe(observerCallback, forcedReport);
52
+ }
53
+ }
54
+ export class ReadOnlyProxyObservable {
55
+ _get;
56
+ _observable;
57
+ constructor(observable, get) {
58
+ this._observable = observable;
59
+ this._get = get;
60
+ }
61
+ get listeners() {
62
+ return this._observable.listeners;
63
+ }
64
+ get value() {
65
+ return this._get(this._observable.value);
66
+ }
67
+ observe(observerCallback, forcedReport = false) {
68
+ return this._observable.observe((value, observer, changed) => observerCallback(this._get(value), observer, changed), forcedReport);
69
+ }
70
+ }
71
+ export const isWritableObservable = (input) => {
72
+ if (input instanceof ReadOnlyObservable)
73
+ return false;
74
+ if (input instanceof ReadOnlyProxyObservable)
75
+ return false;
76
+ return true;
77
+ };
78
+ export class ProxyObservable {
79
+ static doNotSet = Symbol('doNotSet');
80
+ _get;
81
+ _observable;
82
+ _set;
83
+ _suspend = false;
84
+ constructor(observable, get, set) {
85
+ this._observable = observable;
86
+ this._get = get;
87
+ this._set = set;
88
+ }
89
+ get listeners() {
90
+ return this._observable.listeners;
91
+ }
92
+ get value() {
93
+ return this._get(this._observable.value);
94
+ }
95
+ set value(value) {
96
+ if (!isWritableObservable(this._observable))
97
+ return;
98
+ this._suspend = true;
99
+ const nextValue = this._set(value);
100
+ if (nextValue !== ProxyObservable.doNotSet) {
101
+ this._observable.value = nextValue;
102
+ }
103
+ this._suspend = false;
104
+ }
105
+ observe(observerCallback, forcedReport = false) {
106
+ return this._observable.observe((value, observer, changed) => {
107
+ if (this._suspend)
108
+ return;
109
+ observerCallback(this._get(value), observer, changed);
110
+ }, forcedReport);
111
+ }
112
+ }
113
+ export class ObservableGroup extends Observable {
114
+ _observables;
115
+ constructor(initialValue, observables = []) {
116
+ super(initialValue);
117
+ this._observables = observables ? new Set(observables) : new Set();
118
+ for (const state of this._observables) {
119
+ state.observe(() => (super.value = this.value), true);
120
+ }
121
+ }
122
+ get observables() {
123
+ return Array.from(this._observables);
124
+ }
125
+ get values() {
126
+ return this.observables.map(({ value }) => value);
127
+ }
128
+ get value() {
129
+ return this._merge();
130
+ }
131
+ set value(value) {
132
+ for (const observable of this._observables) {
133
+ if (!isWritableObservable(observable)) {
134
+ continue;
135
+ }
136
+ observable.value = value;
137
+ }
138
+ super.value = value;
139
+ }
140
+ _merge() {
141
+ throw new Error(`_merge method not defined in ${this}`);
142
+ }
143
+ }
144
+ export const isObservable = (input) => {
145
+ if (input instanceof Observable)
146
+ return true;
147
+ if (input instanceof ReadOnlyObservable)
148
+ return true;
149
+ if (input instanceof ProxyObservable)
150
+ return true;
151
+ if (input instanceof ReadOnlyProxyObservable)
152
+ return true;
153
+ return false;
154
+ };
155
+ export const isReadOnlyObservable = (input) => {
156
+ if (input instanceof ReadOnlyObservable)
157
+ return true;
158
+ if (input instanceof ReadOnlyProxyObservable)
159
+ return true;
160
+ return false;
161
+ };
162
+ export const observify = (fn) => {
163
+ const observable = new Observable(null);
164
+ const trigger = async () => {
165
+ const result = await promiseGuard(fn());
166
+ observable.value = result;
167
+ };
168
+ return [new ReadOnlyObservable(observable), trigger];
169
+ };
170
+ //# sourceMappingURL=observable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observable.js","sourceRoot":"","sources":["../src/observable.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { AnyObservable, MetaObserverCallback, Observable, ObservableGroup, Observer, ObserverCallback, ProxyObservable } from './observable.js';
2
+ export declare class BooleanState extends Observable<boolean> {
3
+ flip(): boolean;
4
+ }
5
+ export declare class BooleanProxyState<T> extends ProxyObservable<T, boolean> {
6
+ flip(): boolean;
7
+ }
8
+ export declare enum BooleanGroupStrategy {
9
+ IS_TRUE_IF_ALL_TRUE = 0,
10
+ IS_TRUE_IF_SOME_TRUE = 1
11
+ }
12
+ export declare class BooleanStateGroup extends ObservableGroup<boolean> {
13
+ private static _getValue;
14
+ private readonly _strategy;
15
+ constructor(strategy: BooleanGroupStrategy, states?: AnyObservable<boolean>[]);
16
+ protected _merge(): boolean;
17
+ get allOn(): boolean;
18
+ get someOn(): boolean;
19
+ flip(): boolean;
20
+ }
21
+ export declare class BooleanNullableStateGroup extends BooleanStateGroup {
22
+ constructor(strategy: BooleanGroupStrategy, observables?: AnyObservable<boolean | null>[]);
23
+ }
24
+ export declare class EnumState<T = unknown> extends Observable<T> {
25
+ private readonly _enum;
26
+ constructor(anEnum: readonly T[], initialValue: T);
27
+ private get _maxIndex();
28
+ private _indexOf;
29
+ get value(): T;
30
+ set value(value: T);
31
+ getIndex(): number | null;
32
+ next(): this;
33
+ previous(): this;
34
+ setIndex(index: number): this;
35
+ }
36
+ export declare class NullState<T = null> {
37
+ protected readonly _observers: Set<MetaObserverCallback<T | null>>;
38
+ constructor(observerCallback?: MetaObserverCallback<T | null>);
39
+ get listeners(): number;
40
+ get value(): T;
41
+ set value(value: T);
42
+ observe(observerCallback: ObserverCallback<T>): Observer;
43
+ trigger(data?: T | null): void;
44
+ }
45
+ export declare class ReadOnlyNullState<T = null> {
46
+ private readonly _nullState;
47
+ constructor(nullState: NullState<T>);
48
+ get listeners(): number;
49
+ observe(observerCallback: ObserverCallback<T>): Observer;
50
+ }
51
+ export type AnyNullState<T> = NullState<T> | ReadOnlyNullState<T>;
52
+ export declare const isNullState: (input: unknown) => input is AnyNullState<any>;
53
+ //# sourceMappingURL=state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,QAAQ,EACR,gBAAgB,EAChB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAEzB,qBAAa,YAAa,SAAQ,UAAU,CAAC,OAAO,CAAC;IACnD,IAAI,IAAI,OAAO;CAKhB;AAED,qBAAa,iBAAiB,CAAC,CAAC,CAAE,SAAQ,eAAe,CAAC,CAAC,EAAE,OAAO,CAAC;IACnE,IAAI,IAAI,OAAO;CAKhB;AAED,oBAAY,oBAAoB;IAC9B,mBAAmB,IAAA;IACnB,oBAAoB,IAAA;CACrB;AAED,qBAAa,iBAAkB,SAAQ,eAAe,CAAC,OAAO,CAAC;IAC7D,OAAO,CAAC,MAAM,CAAC,SAAS;IAWxB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;gBAG/C,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,GAAE,aAAa,CAAC,OAAO,CAAC,EAAO;IAOvC,SAAS,CAAC,MAAM,IAAI,OAAO;IAI3B,IAAI,KAAK,IAAI,OAAO,CAKnB;IAED,IAAI,MAAM,IAAI,OAAO,CAKpB;IAED,IAAI,IAAI,OAAO;CAKhB;AAED,qBAAa,yBAA0B,SAAQ,iBAAiB;gBAE5D,QAAQ,EAAE,oBAAoB,EAC9B,WAAW,GAAE,aAAa,CAAC,OAAO,GAAG,IAAI,CAAC,EAAO;CAcpD;AAED,qBAAa,SAAS,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,UAAU,CAAC,CAAC,CAAC;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAEzB,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,YAAY,EAAE,CAAC;IASjD,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,CAAC,QAAQ;IAMhB,IAAI,KAAK,IAAI,CAAC,CAEb;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,EAQjB;IAED,QAAQ,IAAI,MAAM,GAAG,IAAI;IAIzB,IAAI,IAAI,IAAI;IASZ,QAAQ,IAAI,IAAI;IAShB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAU9B;AAED,qBAAa,SAAS,CAAC,CAAC,GAAG,IAAI;IAC7B,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,oBAAoB,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;gBAEvD,gBAAgB,CAAC,EAAE,oBAAoB,CAAC,CAAC,GAAG,IAAI,CAAC;IAM7D,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,IAAI,KAAK,IAAI,CAAC,CAEb;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,EAEjB;IAED,OAAO,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,QAAQ;IAgBxD,OAAO,CAAC,IAAI,GAAE,CAAC,GAAG,IAAW,GAAG,IAAI;CAKrC;AAED,qBAAa,iBAAiB,CAAC,CAAC,GAAG,IAAI;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;gBAE9B,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;IAInC,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,OAAO,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,QAAQ;CAGzD;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;AAElE,eAAO,MAAM,WAAW,GACtB,OAAO,OAAO,KAEb,KAAK,IAAI,YAAY,CAAC,GAAG,CAK3B,CAAC"}
package/dist/state.js ADDED
@@ -0,0 +1,156 @@
1
+ import { Observable, ObservableGroup, ProxyObservable, } from './observable.js';
2
+ export class BooleanState extends Observable {
3
+ flip() {
4
+ this.value = !this.value;
5
+ return this.value;
6
+ }
7
+ }
8
+ export class BooleanProxyState extends ProxyObservable {
9
+ flip() {
10
+ this.value = !this.value;
11
+ return this.value;
12
+ }
13
+ }
14
+ export var BooleanGroupStrategy;
15
+ (function (BooleanGroupStrategy) {
16
+ BooleanGroupStrategy[BooleanGroupStrategy["IS_TRUE_IF_ALL_TRUE"] = 0] = "IS_TRUE_IF_ALL_TRUE";
17
+ BooleanGroupStrategy[BooleanGroupStrategy["IS_TRUE_IF_SOME_TRUE"] = 1] = "IS_TRUE_IF_SOME_TRUE";
18
+ })(BooleanGroupStrategy || (BooleanGroupStrategy = {}));
19
+ export class BooleanStateGroup extends ObservableGroup {
20
+ static _getValue(strategy, observables) {
21
+ const values = observables.map(({ value }) => value);
22
+ return strategy === BooleanGroupStrategy.IS_TRUE_IF_ALL_TRUE
23
+ ? !values.includes(false)
24
+ : values.includes(true);
25
+ }
26
+ _strategy;
27
+ constructor(strategy, states = []) {
28
+ super(BooleanStateGroup._getValue(strategy, states), states);
29
+ this._strategy = strategy;
30
+ }
31
+ _merge() {
32
+ return BooleanStateGroup._getValue(this._strategy, this.observables);
33
+ }
34
+ get allOn() {
35
+ return BooleanStateGroup._getValue(BooleanGroupStrategy.IS_TRUE_IF_ALL_TRUE, this.observables);
36
+ }
37
+ get someOn() {
38
+ return BooleanStateGroup._getValue(BooleanGroupStrategy.IS_TRUE_IF_SOME_TRUE, this.observables);
39
+ }
40
+ flip() {
41
+ this.value = !this.value;
42
+ return this.value;
43
+ }
44
+ }
45
+ export class BooleanNullableStateGroup extends BooleanStateGroup {
46
+ constructor(strategy, observables = []) {
47
+ super(strategy, observables.map((observable) => new ProxyObservable(observable, (value) => Boolean(value), (value) => value)));
48
+ }
49
+ }
50
+ export class EnumState extends Observable {
51
+ _enum;
52
+ constructor(anEnum, initialValue) {
53
+ if (!anEnum.includes(initialValue)) {
54
+ throw new RangeError(`"${initialValue}" is not an allowed value`);
55
+ }
56
+ super(initialValue);
57
+ this._enum = anEnum;
58
+ }
59
+ get _maxIndex() {
60
+ return this._enum.length - 1;
61
+ }
62
+ _indexOf(value) {
63
+ const index = this._enum.indexOf(value);
64
+ return index === -1 ? null : index;
65
+ }
66
+ get value() {
67
+ return super.value;
68
+ }
69
+ set value(value) {
70
+ if (value === super.value)
71
+ return;
72
+ if (!this._enum.includes(value)) {
73
+ throw new RangeError(`"${value}" is not an allowed value`);
74
+ }
75
+ super.value = value;
76
+ }
77
+ getIndex() {
78
+ return this._indexOf(this.value);
79
+ }
80
+ next() {
81
+ const currentIndex = this._indexOf(this.value);
82
+ if (currentIndex === null)
83
+ return this;
84
+ const index = currentIndex === this._maxIndex ? 0 : currentIndex + 1;
85
+ return this.setIndex(index);
86
+ }
87
+ previous() {
88
+ const currentIndex = this._indexOf(this.value);
89
+ if (currentIndex === null)
90
+ return this;
91
+ const index = currentIndex === 0 ? this._maxIndex : currentIndex - 1;
92
+ return this.setIndex(index);
93
+ }
94
+ setIndex(index) {
95
+ if (index < 0 || index > this._maxIndex) {
96
+ throw new RangeError(`"${index}" is a not existing index`);
97
+ }
98
+ const nextValue = this._enum[index];
99
+ if (nextValue)
100
+ this.value = nextValue;
101
+ return this;
102
+ }
103
+ }
104
+ export class NullState {
105
+ _observers;
106
+ constructor(observerCallback) {
107
+ this._observers = observerCallback
108
+ ? new Set([observerCallback])
109
+ : new Set();
110
+ }
111
+ get listeners() {
112
+ return this._observers.size;
113
+ }
114
+ get value() {
115
+ return undefined;
116
+ }
117
+ set value(value) {
118
+ this.trigger(value);
119
+ }
120
+ observe(observerCallback) {
121
+ let observer;
122
+ const metaObserverCallback = (value, changed) => {
123
+ observerCallback(value, observer, changed);
124
+ };
125
+ this._observers.add(metaObserverCallback);
126
+ observer = {
127
+ remove: () => this._observers.delete(metaObserverCallback),
128
+ };
129
+ return observer;
130
+ }
131
+ trigger(data = null) {
132
+ for (const observer of this._observers) {
133
+ observer(data, false);
134
+ }
135
+ }
136
+ }
137
+ export class ReadOnlyNullState {
138
+ _nullState;
139
+ constructor(nullState) {
140
+ this._nullState = nullState;
141
+ }
142
+ get listeners() {
143
+ return this._nullState.listeners;
144
+ }
145
+ observe(observerCallback) {
146
+ return this._nullState.observe(observerCallback);
147
+ }
148
+ }
149
+ export const isNullState = (input) => {
150
+ if (input instanceof NullState)
151
+ return true;
152
+ if (input instanceof ReadOnlyNullState)
153
+ return true;
154
+ return false;
155
+ };
156
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../src/state.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { AnyReadOnlyObservable, ReadOnlyProxyObservable } from './observable.js';
2
+ import { BooleanState, NullState } from './state.js';
3
+ export declare class Timer extends NullState {
4
+ private readonly _time;
5
+ private _timeout;
6
+ private readonly _triggerTime;
7
+ readonly isEnabled: BooleanState;
8
+ readonly runoutTime: ReadOnlyProxyObservable<number | null>;
9
+ constructor(time?: number, enableFromStart?: boolean);
10
+ get isActive(): AnyReadOnlyObservable<boolean>;
11
+ get triggerTime(): AnyReadOnlyObservable<number | null>;
12
+ private _handleFire;
13
+ disable(): void;
14
+ enable(): void;
15
+ start(restart?: boolean): void;
16
+ stop(): void;
17
+ }
18
+ //# sourceMappingURL=timer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timer.d.ts","sourceRoot":"","sources":["../src/timer.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EAGrB,uBAAuB,EACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAErD,qBAAa,KAAM,SAAQ,SAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuC;IAEpE,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,uBAAuB,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;gBAEhD,IAAI,SAAI,EAAE,eAAe,UAAO;IAoB5C,IAAI,QAAQ,IAAI,qBAAqB,CAAC,OAAO,CAAC,CAE7C;IAED,IAAI,WAAW,IAAI,qBAAqB,CAAC,MAAM,GAAG,IAAI,CAAC,CAEtD;IAED,OAAO,CAAC,WAAW;IAKnB,OAAO,IAAI,IAAI;IAIf,MAAM,IAAI,IAAI;IAId,KAAK,CAAC,OAAO,UAAO,GAAG,IAAI;IAU3B,IAAI,IAAI,IAAI;CAOb"}
package/dist/timer.js ADDED
@@ -0,0 +1,56 @@
1
+ import { Observable, ReadOnlyObservable, ReadOnlyProxyObservable, } from './observable.js';
2
+ import { BooleanState, NullState } from './state.js';
3
+ export class Timer extends NullState {
4
+ _time;
5
+ _timeout;
6
+ _triggerTime = new Observable(null);
7
+ isEnabled;
8
+ runoutTime;
9
+ constructor(time = 0, enableFromStart = true) {
10
+ super();
11
+ this._time = time;
12
+ this.isEnabled = new BooleanState(enableFromStart, (enabled) => {
13
+ if (enabled)
14
+ return;
15
+ this.stop();
16
+ });
17
+ this.runoutTime = new ReadOnlyProxyObservable(this._triggerTime, (value) => {
18
+ if (value === null)
19
+ return null;
20
+ return value + this._time;
21
+ });
22
+ }
23
+ get isActive() {
24
+ return new ReadOnlyProxyObservable(this._triggerTime, Boolean);
25
+ }
26
+ get triggerTime() {
27
+ return new ReadOnlyObservable(this._triggerTime);
28
+ }
29
+ _handleFire() {
30
+ this.stop();
31
+ this.trigger(null);
32
+ }
33
+ disable() {
34
+ this.isEnabled.value = false;
35
+ }
36
+ enable() {
37
+ this.isEnabled.value = true;
38
+ }
39
+ start(restart = true) {
40
+ if (!this.isEnabled.value)
41
+ return;
42
+ if (this._timeout && !restart)
43
+ return;
44
+ this.stop();
45
+ this._timeout = setTimeout(() => this._handleFire(), this._time);
46
+ this._triggerTime.value = Date.now();
47
+ }
48
+ stop() {
49
+ if (!this._timeout)
50
+ return;
51
+ clearTimeout(this._timeout);
52
+ this._timeout = null;
53
+ this._triggerTime.value = null;
54
+ }
55
+ }
56
+ //# sourceMappingURL=timer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timer.js","sourceRoot":"","sources":["../src/timer.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EACV,kBAAkB,EAClB,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAErD,MAAM,OAAO,KAAM,SAAQ,SAAS;IACjB,KAAK,CAAS;IACvB,QAAQ,CAAwB;IACvB,YAAY,GAAG,IAAI,UAAU,CAAgB,IAAI,CAAC,CAAC;IAE3D,SAAS,CAAe;IACxB,UAAU,CAAyC;IAE5D,YAAY,IAAI,GAAG,CAAC,EAAE,eAAe,GAAG,IAAI;QAC1C,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,IAAI,CAAC,SAAS,GAAG,IAAI,YAAY,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,EAAE;YAC7D,IAAI,OAAO;gBAAE,OAAO;YAEpB,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,GAAG,IAAI,uBAAuB,CAC3C,IAAI,CAAC,YAAY,EACjB,CAAC,KAAK,EAAE,EAAE;YACR,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAChC,OAAO,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC5B,CAAC,CACF,CAAC;IACJ,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,uBAAuB,CAAC,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACnD,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,OAAO;QACL,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,MAAM;QACJ,IAAI,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO,GAAG,IAAI;QAClB,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK;YAAE,OAAO;QAClC,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO;YAAE,OAAO;QAEtC,IAAI,CAAC,IAAI,EAAE,CAAC;QAEZ,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACjE,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvC,CAAC;IAED,IAAI;QACF,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE3B,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC;IACjC,CAAC;CACF"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@mrpelz/observable",
3
+ "version": "1.0.0",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/mrpelz/utils.git",
7
+ "directory": "packages/observable"
8
+ },
9
+ "license": "UNLICENSED",
10
+ "author": "Lennart Pelz <mail@mrpelz.de>",
11
+ "type": "module",
12
+ "exports": {
13
+ ".": {
14
+ "default": "./dist/main.js",
15
+ "types": "./dist/main.d.ts"
16
+ },
17
+ "./observable": {
18
+ "default": "./dist/observable.js",
19
+ "types": "./dist/observable.d.ts"
20
+ },
21
+ "./state": {
22
+ "default": "./dist/state.js",
23
+ "types": "./dist/state.d.ts"
24
+ },
25
+ "./timer": {
26
+ "default": "./dist/timer.js",
27
+ "types": "./dist/timer.d.ts"
28
+ }
29
+ },
30
+ "main": "dist/main.js",
31
+ "module": "dist/main.js",
32
+ "types": "dist/main.d.ts",
33
+ "files": [
34
+ "dist/**/*.{js,map,ts}"
35
+ ],
36
+ "dependencies": {
37
+ "@mrpelz/misc-utils": "*"
38
+ },
39
+ "devDependencies": {
40
+ "@mrpelz/boilerplate-common": "^14.0.0"
41
+ }
42
+ }