Skip to content
Snippets Groups Projects
experiments.ts 1.14 KiB
Newer Older
insert's avatar
insert committed
export type Experiments = never;
export const AVAILABLE_EXPERIMENTS: Experiments[] = [ ];

export interface ExperimentOptions {
    enabled?: Experiments[]
}

export type ExperimentsAction =
    | { type: undefined }
    | {
          type: "EXPERIMENTS_ENABLE";
          key: Experiments;
      }
    | {
          type: "EXPERIMENTS_DISABLE";
          key: Experiments;
      };

export function experiments(
    state = {} as ExperimentOptions,
    action: ExperimentsAction
): ExperimentOptions {
    switch (action.type) {
        case "EXPERIMENTS_ENABLE":
            return {
                ...state,
                enabled: [
                    ...(state.enabled ?? [])
                        .filter(x => AVAILABLE_EXPERIMENTS.includes(x))
                        .filter(v => v !== action.key),
                    action.key
                ]
            };
        case "EXPERIMENTS_DISABLE":
            return {
                ...state,
                enabled: state.enabled?.filter(v => v !== action.key)
                    .filter(x => AVAILABLE_EXPERIMENTS.includes(x))
            };
        default:
            return state;
    }
}