import type { GetFieldType } from 'lodash';
import type { ObjectKey } from '@dr.pogodin/js-utils';
export type CallbackT = () => void;
export declare const force: unique symbol;
export declare const lock: unique symbol;
export type ForceT = typeof force;
export type LockT = typeof lock;
export type TypeLock<Unlocked extends ForceT | LockT, LockedT extends never | void, UnlockedT> = Unlocked extends ForceT ? UnlockedT : LockedT;
/**
 * Given the type of state, `StateT`, and the type of state path, `PathT`,
 * it evaluates the type of value at that path of the state, if it can be
 * evaluated from the path type (it is possible when `PathT` is a string
 * literal type, and `StateT` elements along this path have appropriate
 * types); otherwise it falls back to the specified `UnknownT` type,
 * which should be set either `never` (for input arguments), or `void`
 * (for return types) - `never` and `void` in those places forbid assignments,
 * and are not auto-inferred to more permissible types.
 *
 * BEWARE: When StateT is any the construct resolves to any for any string
 * paths.
 */
export type ValueAtPathT<StateT, PathT extends null | string | undefined, UnknownT extends never | undefined | void> = unknown extends StateT ? UnknownT : string extends PathT ? UnknownT : PathT extends null | undefined ? StateT : GetFieldType<StateT, PathT> extends undefined ? UnknownT : GetFieldType<StateT, PathT>;
export type ValueOrInitializerT<ValueT> = (() => ValueT) | ValueT;
/**
 * Returns 'true' if debug logging should be performed; 'false' otherwise.
 *
 * BEWARE: The actual safeguards for the debug logging still should read
 *  if (process.env.NODE_ENV !== 'production' && isDebugMode()) {
 *    // Some debug logging
 *  }
 * to ensure that debug code is stripped out by Webpack in production mode.
 *
 * @returns
 * @ignore
 */
export declare function isDebugMode(): boolean;
/**
 * Deep-clones given value for logging purposes, or returns the value itself
 * if the previous clone attempt, with the same key, took more than 300ms
 * (to avoid situations when large payload in the global state slows down
 * development versions of the app due to the logging overhead).
 */
export declare function cloneDeepForLog<T>(value: T, key?: string): T;
export declare function areEqual<K extends ObjectKey>(a: Record<K, boolean>, b: Record<K, boolean>): boolean;
