type ShallowEqualFn<T = any> = (prev: T, current: T) => boolean;
type EqualityFn<T = any> = (prev: T, current: T, shallowEqual: ShallowEqualFn<T>) => boolean;
type SelectorFn<Value, Selected> = (value: Value) => Selected;
type UseHookType<InitialValue, Value> = (initialValue: InitialValue) => Value;
type Middleware<Value> = {
    onInit?: (value: Value) => void;
    onChange?: (value: Value) => void;
};

export type { EqualityFn, Middleware, SelectorFn, ShallowEqualFn, UseHookType };
