# Shared 类型集

# Function

export type Function<T, R> = (arg: T) => R;

# BiFunction

export type BiFunction<T extends Array<unknown>, R> = (...arg: T) => R;

# Supplier

export type Supplier<R> = () => R;

# Runnable

export type Runnable = () => void;

# Consumer

export type Consumer<T> = (arg: T) => void;

# BiConsumer

export type BiConsumer<T extends Array<unknown>> = (...arg: T) => void;

# StorageModuleSchema

type StorageModuleSchema = Record<string, unknown>;

# ResetterKey

type ResetterKey<T> = PrefixedKey<T, 'reset'>;

# CheckerKey

type CheckerKey<T> = PrefixedKey<T, 'contains'>;

# Resetter

type Resetter = () => void;

# Checker

type Checker = () => boolean;

# PrefixedKey

type PrefixedKey<T, Prefix extends string> = T extends string ? `${Prefix}${Capitalize<T>}` : never;

# SuffixedKey

type SuffixedKey<T, Suffix extends string> = T extends string ? `${T}${Capitalize<Suffix>}` : never;

# RestorePrefixedKey

type RestorePrefixedKey<T, Prefix extends string> = T extends `${Prefix}${infer U}` ? Uncapitalize<U> : never;

# RestoreSuffixedKey

type RestoreSuffixedKey<T, Suffix extends string> = T extends `${infer U}${Capitalize<Suffix>}` ? U : never;

# PrefixedKeys

type PrefixedKeys<T, Prefix extends string> = PrefixedKey<keyof T, Prefix>;

# SuffixedKeys

type SuffixedKeys<T, Suffix extends string> = SuffixedKey<keyof T, Suffix>;

# IsOptional

type IsOptional<T extends object, K extends keyof T> = {
  [K1 in Exclude<keyof T, K>]: T[K1];
} & { K?: T[K] } extends T
  ? K
  : never;

# OptionalKeys

type OptionalKeys<T extends object> = {
  [K in keyof T]-?: IsOptional<T, K>;
}[keyof T];

# PickNonNullable

type PickNonNullable<T extends object> = Omit<T, OptionalKeys<T>>;