import Reference, { PathReference } from './reference'; import { Opaque, Slice, LinkedListNode } from '@glimmer/util'; export interface EntityTag extends Reference { value(): T; validate(snapshot: T): boolean; } export interface Tagged { tag: EntityTag; } export declare type Revision = number; export declare const CONSTANT: Revision; export declare const INITIAL: Revision; export declare const VOLATILE: Revision; export declare abstract class RevisionTag implements EntityTag { abstract value(): Revision; validate(snapshot: Revision): boolean; } export declare class DirtyableTag extends RevisionTag { private revision; constructor(revision?: number); value(): Revision; dirty(): void; } export declare function combineTagged(tagged: ReadonlyArray>): RevisionTag; export declare function combineSlice(slice: Slice & LinkedListNode>): RevisionTag; export declare function combine(tags: RevisionTag[]): RevisionTag; export declare abstract class CachedTag extends RevisionTag { private lastChecked; private lastValue; value(): Revision; protected invalidate(): void; protected abstract compute(): Revision; } export declare class UpdatableTag extends CachedTag { private tag; private lastUpdated; constructor(tag: RevisionTag); protected compute(): Revision; update(tag: RevisionTag): void; } export declare const CONSTANT_TAG: RevisionTag; export declare const VOLATILE_TAG: RevisionTag; export declare const CURRENT_TAG: DirtyableTag; export interface VersionedReference extends Reference, Tagged { } export interface VersionedPathReference extends PathReference, Tagged { get(property: string): VersionedPathReference; } export declare abstract class CachedReference implements VersionedReference { abstract tag: RevisionTag; private lastRevision; private lastValue; value(): T; protected abstract compute(): T; protected invalidate(): void; } export declare type Mapper = (value: T) => U; export declare function map(reference: VersionedReference, mapper: Mapper): VersionedReference; export declare class ReferenceCache implements Tagged { tag: RevisionTag; private reference; private lastValue; private lastRevision; private initialized; constructor(reference: VersionedReference); peek(): T; revalidate(): Validation; private initialize(); } export declare type Validation = T | NotModified; export declare type NotModified = "adb3b78e-3d22-4e4b-877a-6317c2c5c145"; export declare function isModified(value: Validation): value is T;