import { MySqlSelectBase, MySqlSelectBuilder } from "../query-builders/select.cjs";
import { MySqlSelectHKTBase, SelectedFields } from "../query-builders/select.types.cjs";
import { MySqlPreparedQueryConfig } from "../session.cjs";
import { MySqlEffectPreparedQuery, MySqlEffectSession } from "./session.cjs";
import { entityKind } from "../../entity.cjs";
import { BuildSubquerySelection, JoinNullability, SelectMode, SelectResult } from "../../query-builders/select.types.cjs";
import { ColumnsSelection } from "../../sql/sql.cjs";
import { Assume } from "../../utils.cjs";
import * as Effect from "effect/Effect";
import { QueryEffectHKTBase } from "../../effect-core/query-effect.cjs";

//#region src/mysql-core/effect/select.d.ts
type MySqlEffectSelectPrepare<T extends AnyMySqlEffectSelect, TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase> = MySqlEffectPreparedQuery<MySqlPreparedQueryConfig & {
  execute: T['_']['result'];
  iterator: T['_']['result'][number];
}, TEffectHKT>;
type MySqlEffectSelectBuilder<TSelection extends SelectedFields | undefined, TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase> = MySqlSelectBuilder<TSelection, MySqlEffectSelectHKT<TEffectHKT>>;
type MySqlEffectSelect<TTableName extends string | undefined = string | undefined, TSelection extends ColumnsSelection = Record<string, any>, TSelectMode extends SelectMode = SelectMode, TNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>> = MySqlEffectSelectBase<TTableName, TSelection, TSelectMode, TNullabilityMap, true, never>;
interface MySqlEffectSelectHKT<TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase> extends MySqlSelectHKTBase {
  _type: MySqlEffectSelectBase<this['tableName'], Assume<this['selection'], ColumnsSelection>, this['selectMode'], Assume<this['nullabilityMap'], Record<string, JoinNullability>>, this['dynamic'], this['excludedMethods'], Assume<this['result'], any[]>, Assume<this['selectedFields'], ColumnsSelection>, TEffectHKT>;
}
interface MySqlEffectSelectBase<TTableName extends string | undefined, TSelection extends ColumnsSelection, TSelectMode extends SelectMode, TNullabilityMap extends Record<string, JoinNullability> = (TTableName extends string ? Record<TTableName, 'not-null'> : {}), TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[], TSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>, TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase> extends Effect.Effect<TResult, TEffectHKT['error'], TEffectHKT['context']> {}
declare class MySqlEffectSelectBase<TTableName extends string | undefined, TSelection, TSelectMode extends SelectMode, TNullabilityMap extends Record<string, JoinNullability> = (TTableName extends string ? Record<TTableName, 'not-null'> : {}), TDynamic extends boolean = false, TExcludedMethods extends string = never, TResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[], TSelectedFields = BuildSubquerySelection<TSelection, TNullabilityMap>, TEffectHKT extends QueryEffectHKTBase = QueryEffectHKTBase> extends MySqlSelectBase<MySqlEffectSelectHKT<TEffectHKT>, TTableName, TSelection, TSelectMode, TNullabilityMap, TDynamic, TExcludedMethods, TResult, TSelectedFields> {
  static readonly [entityKind]: string;
  readonly session: MySqlEffectSession<TEffectHKT, any, any>;
  prepare(): MySqlEffectSelectPrepare<this, TEffectHKT>;
  execute: ReturnType<this['prepare']>['execute'];
}
type AnyMySqlEffectSelect = MySqlEffectSelectBase<any, any, any, any, any, any, any, any, any>;
//#endregion
export { AnyMySqlEffectSelect, MySqlEffectSelect, MySqlEffectSelectBase, MySqlEffectSelectBuilder, MySqlEffectSelectHKT, MySqlEffectSelectPrepare };
//# sourceMappingURL=select.d.cts.map