import { Adapter } from 'flags';
import { Client, FlagEvaluationOptions, EvaluationContext } from '@openfeature/server-sdk';

type AdapterResponse<ClientType> = {
    booleanValue: (options?: FlagEvaluationOptions) => Adapter<boolean, EvaluationContext>;
    stringValue: (options?: FlagEvaluationOptions) => Adapter<string, EvaluationContext>;
    numberValue: (options?: FlagEvaluationOptions) => Adapter<number, EvaluationContext>;
    objectValue: <ValueType>(options?: FlagEvaluationOptions) => Adapter<ValueType, EvaluationContext>;
    client: ClientType;
};
/**
 * Creates a sync OpenFeature adapter.
 * @param init Client
 * @example
 * ```
 * const openFeatureAdapter = createOpenFeatureAdapter(async () => {
 *   await OpenFeature.setProviderAndWait(
 *     new LaunchDarklyProvider("sdk-3eb98afb-a6ff-4d8c-a648-ddd35cad4140")
 *   );
 *   return OpenFeature.getClient();
 * });
 * ```
 */
declare function createOpenFeatureAdapter(init: Client): AdapterResponse<Client>;
/**
 * Creates an async OpenFeature adapter.
 *
 * @param init () => Promise<Client>
 * @example
 * ```
 * OpenFeature.setProvider(someProvider);
 * const openFeatureAdapter = createOpenFeatureAdapter(OpenFeature.getClient());
 * ```
 */
declare function createOpenFeatureAdapter(init: () => Promise<Client>): AdapterResponse<() => Promise<Client>>;

export { createOpenFeatureAdapter };
