import { HashSet } from "@tsplus/stdlib/collections/HashSet/definition";
import { MetricLabel } from "@effect/core/io/Metrics/MetricLabel";
import { Effect } from "@effect/core/io/Effect/definition";
import { MetricKeyType } from "@effect/core/io/Metrics/MetricKeyType";
import { MetricState } from "@effect/core/io/Metrics/MetricState";
import type { HistogramBoundaries, HistogramBoundariesOps } from "@effect/core/io/Metrics/Boundaries";
export declare const MetricSym: unique symbol;
export declare type MetricSym = typeof MetricSym;
/**
 * A `Metric<Type, In, Out>` represents a concurrent metric which accepts
 * updates of type `In` and are aggregated to a stateful value of type `Out`.
 *
 * For example, a counter metric would have type `Metric<number, number>`,
 * representing the fact that the metric can be updated with numbers (the amount
 * to increment or decrement the counter by), and the state of the counter is a
 * number.
 *
 * There are five primitive metric types supported by Effect:
 *
 *   - Counters
 *   - Frequencies
 *   - Gauges
 *   - Histograms
 *   - Summaries
 *
 * @tsplus type ets/Metrics/Metric
 */
export interface Metric<Type, In, Out> {
    readonly [MetricSym]: MetricSym;
    readonly keyType: Type;
    readonly unsafeUpdate: (input: In, extraTags: HashSet<MetricLabel>) => void;
    readonly unsafeValue: (extraTags: HashSet<MetricLabel>) => Out;
    <R, E, A extends In>(effect: Effect<R, E, A>, __tsplusTrace?: string): Effect<R, E, A>;
}
/**
 * @tsplus type ets/Metrics/Metric/Ops
 */
export interface MetricOps {
    /**
     * The type of the underlying primitive metric. For example, this could be
     * `MetricKeyType.Counter` or `MetricKeyType.Gauge`.
     */
    <Type, In, Out>(keyType: Type, unsafeUpdate: (input: In, extraTags: HashSet<MetricLabel>) => void, unsafeValue: (extraTags: HashSet<MetricLabel>) => Out): Metric<Type, In, Out>;
}
export declare const Metric: MetricOps;
export declare namespace Metric {
    interface Counter<In> extends Metric<MetricKeyType.Counter, In, MetricState.Counter> {
    }
    interface Gauge<In> extends Metric<MetricKeyType.Gauge, In, MetricState.Gauge> {
    }
    interface Frequency<In> extends Metric<MetricKeyType.Frequency, In, MetricState.Frequency> {
    }
    interface Histogram<In> extends Metric<MetricKeyType.Histogram, In, MetricState.Histogram> {
    }
    interface Summary<In> extends Metric<MetricKeyType.Summary, In, MetricState.Summary> {
    }
    namespace Histogram {
        /**
         * @tsplus type ets/Metrics/Histogram/Boundaries
         */
        type Boundaries = HistogramBoundaries;
    }
}
/**
 * @tsplus static ets/Metrics/Metric/Ops $
 * @tsplus location "@effect/core/io/Metrics/definition"
 */
export declare const metricAspects: MetricAspects;
/**
 * @tsplus static ets/Metrics/Metric/Ops Histogram
 * @tsplus location "@effect/core/io/Metrics/definition"
 */
export declare const histogramBoundaries: {
    readonly Boundaries: HistogramBoundariesOps;
};
/**
 * @tsplus type ets/Metrics/Metric/Aspects
 */
export interface MetricAspects {
}
//# sourceMappingURL=definition.d.ts.map