import { Integer, } from '@pbkware/js-utils'; import { RevRecordValueRecentChangeTypeId } from '../../../../../record/server'; import { RevTableValue } from '../value'; /** @public */ export abstract class RevTableValueSource { valueChangesEvent: RevTableValueSource.ValueChangesEvent; allValuesChangeEvent: RevTableValueSource.AllValuesChangeEvent; becomeIncubatedEventer: RevTableValueSource.BecomeIncubatedEventer; protected _beenIncubated = false; constructor(private readonly _firstFieldIndexOffset: Integer ) { } get beenIncubated(): boolean { return this._beenIncubated; } get fieldCount() { return this.getfieldCount(); } get firstFieldIndexOffset() { return this._firstFieldIndexOffset; } protected notifyValueChangesEvent(valueChanges: RevTableValueSource.ValueChange[]) { for (let i = 0; i < valueChanges.length; i++) { valueChanges[i].fieldIndex += this._firstFieldIndexOffset; } this.valueChangesEvent(valueChanges); } protected notifyAllValuesChangeEvent(newValues: RevTableValue[]) { this.allValuesChangeEvent(this._firstFieldIndexOffset, newValues); } protected initialiseBeenIncubated(value: boolean) { this._beenIncubated = value; } protected processDataCorrectnessChanged(allValues: RevTableValue[], incubated: boolean) { this.allValuesChangeEvent(this._firstFieldIndexOffset, allValues); if (incubated) { this.checkNotifyBecameIncubated(); } } private checkNotifyBecameIncubated() { if (!this._beenIncubated) { this._beenIncubated = true; this.becomeIncubatedEventer(); } } abstract activate(): RevTableValue[]; abstract deactivate(): void; abstract getAllValues(): RevTableValue[]; protected abstract getfieldCount(): Integer; } /** @public */ export namespace RevTableValueSource { export interface ChangedValue { fieldIdx: Integer; newValue: RevTableValue; } export interface ValueChange { fieldIndex: Integer; newValue: RevTableValue; recentChangeTypeId: RevRecordValueRecentChangeTypeId | undefined; } export namespace ValueChange { export function arrayIncludesFieldIndex( array: readonly ValueChange[], fieldIndex: Integer, end: Integer ): boolean { for (let i = 0; i < end; i++) { const valueChange = array[i]; if (valueChange.fieldIndex === fieldIndex) { return true; } } return false; } } export type BeginValuesChangeEvent = (this: void) => void; export type EndValuesChangeEvent = (this: void) => void; export type ValueChangesEvent = ( valueChanges: ValueChange[] ) => void; export type AllValuesChangeEvent = ( firstFieldIdxOffset: Integer, newValues: RevTableValue[] ) => void; export type BecomeIncubatedEventer = (this: void) => void; export type Constructor = new( firstFieldIdxOffset: Integer, recordIdx: Integer ) => RevTableValueSource; }