import { TypedEvent } from "../util/TypedEvent"; import { FieldUpdatedArgs } from "./FieldUpdatedArgs"; import { DocumentReferenceController } from "./DocumentReferenceController"; import { Utils } from "../Utils"; export function Cast(field: Opt, ctor: { new(): T }): Opt { if (field) { if (ctor && field instanceof ctor) { return field; } } return undefined; } export type Opt = T | undefined; export abstract class FieldController { FieldUpdated: TypedEvent> = new TypedEvent>(); private id: string; get Id(): string { return this.id; } constructor(id: Opt = undefined) { this.id = id || Utils.GenerateGuid(); } protected DereferenceImpl(): Opt { return this; } protected DereferenceToRootImpl(): Opt { return this; } Dereference(ctor?: { new(): T }): Opt { let field = this.DereferenceImpl(); if (ctor && field instanceof ctor) { return field; } else { return undefined; } } DereferenceToRoot(ctor?: { new(): T }): Opt { let field = this.DereferenceToRootImpl(); if (ctor && field instanceof ctor) { return field; } else { return undefined; } } Equals(other: FieldController) : boolean { return this.id === other.id; } abstract TrySetValue(value: any): boolean; abstract GetValue(): any; abstract Copy(): FieldController; }