Skip to content
Snippets Groups Projects
object.ts 1.77 KiB
Newer Older
David Sehnal's avatar
David Sehnal committed
/**
 * Copyright (c) 2018 mol* contributors, licensed under MIT, See LICENSE file for more info.
 *
 * @author David Sehnal <david.sehnal@gmail.com>
 */

David Sehnal's avatar
David Sehnal committed
import { UUID } from 'mol-util';
David Sehnal's avatar
David Sehnal committed
import { Transform } from './transform';
David Sehnal's avatar
David Sehnal committed
export { StateObject, StateObjectCell }
David Sehnal's avatar
David Sehnal committed

David Sehnal's avatar
David Sehnal committed
interface StateObject<P = any, D = any, T = any> {
David Sehnal's avatar
David Sehnal committed
    readonly id: UUID,
David Sehnal's avatar
David Sehnal committed
    readonly type: StateObject.Type<T>,
    readonly props: P,
    readonly data: D
David Sehnal's avatar
David Sehnal committed
}

David Sehnal's avatar
David Sehnal committed
namespace StateObject {
David Sehnal's avatar
David Sehnal committed
    export function factory<Type, CommonProps>() {
        return <D = { }, P = {}>(type: Type) => create<P & CommonProps, D, Type>(type);
David Sehnal's avatar
David Sehnal committed
    export type Type<I = unknown> = I
    export type Ctor = { new(...args: any[]): StateObject, type: any }
David Sehnal's avatar
David Sehnal committed
    export function create<Props, Data, Type>(type: Type) {
        return class implements StateObject<Props, Data, Type> {
            static type = type;
            static is(obj?: StateObject): obj is StateObject<Props, Data, Type> { return !!obj && type === obj.type; }
David Sehnal's avatar
David Sehnal committed
            id = UUID.create();
David Sehnal's avatar
David Sehnal committed
            type = type;
            constructor(public props: Props, public data: Data) { }
        }
    }
David Sehnal's avatar
David Sehnal committed
}

David Sehnal's avatar
David Sehnal committed
interface StateObjectCell {
    transform: Transform,

    // Which object was used as a parent to create data in this cell
    sourceRef: Transform.Ref | undefined,

David Sehnal's avatar
David Sehnal committed
    version: string
David Sehnal's avatar
David Sehnal committed
    status: StateObjectCell.Status,
David Sehnal's avatar
David Sehnal committed

David Sehnal's avatar
David Sehnal committed
    errorText?: string,
David Sehnal's avatar
David Sehnal committed
    obj?: StateObject
David Sehnal's avatar
David Sehnal committed
}

David Sehnal's avatar
David Sehnal committed
namespace StateObjectCell {
David Sehnal's avatar
David Sehnal committed
    export type Status = 'ok' | 'error' | 'pending' | 'processing'
David Sehnal's avatar
David Sehnal committed
    export interface State {
David Sehnal's avatar
David Sehnal committed
        isObjectHidden: boolean,
David Sehnal's avatar
David Sehnal committed
        isHidden: boolean,
David Sehnal's avatar
David Sehnal committed
        isBinding: boolean,
        isCollapsed: boolean
David Sehnal's avatar
David Sehnal committed

    export const DefaultState: State = {
        isObjectHidden: false,
        isHidden: false,
        isBinding: false,
        isCollapsed: false
    };
David Sehnal's avatar
David Sehnal committed
}