

export type IValueOfListFilterType<T> = {
    value: T;
};

export type IFilterMethodType = | 'equal' | 'from' | 'to' | 'between' | 'list' | 'contain' | undefined;

export interface IFilterBase<T, L> {
    key: string,
    method: IFilterMethodType;
    setMethodValue: (value: number | undefined) => void;
    getMethodValue: () => | 0 | 1 | 2 | 3 | 4 | undefined;
    isFiltered: () => boolean;
    clearFilter: () => void;
    keyOfMethod: string;
    list: { value: L }[] | undefined;
    itemOfListValue?: T;
    multiItem?: IValueOfListFilterType<L>;
    multiItemTimer?: NodeJS.Timeout;
}

export abstract class FilterBase<T, L, FILTERTYPE> implements IFilterBase<T, L> {
    abstract key: string;
    abstract method: IFilterMethodType;
    abstract setMethodValue: (value: number | undefined) => void;
    abstract getMethodValue: () => | 0 | 1 | 2 | 3 | 4 | undefined;
    abstract getFilter: () => FILTERTYPE | undefined;
    abstract isFiltered: () => boolean;
    abstract clearFilter: () => void;
    abstract keyOfMethod: string;
    list: { value: L }[] | undefined;
    abstract itemOfListValue?: T;
    abstract multiItem?: IValueOfListFilterType<L>;
    abstract multiItemTimer?: NodeJS.Timeout;
}