/**
 * IPv4 or IPv6 cidr block schemas.
 *
 * @since 1.0.0
 */
import type * as Family from "./family.js";
import * as Array from "effect/Array";
import * as Effect from "effect/Effect";
import * as ParseResult from "effect/ParseResult";
import * as Schema from "effect/Schema";
import * as Stream from "effect/Stream";
import * as Address from "./address.js";
import * as CidrBlockMask from "./cidrBlockMask.js";
import * as IPv4 from "./ipv4.js";
import * as IPv6 from "./ipv6.js";
declare const CidrBlockBase_base: Schema.Class<CidrBlockBase<"ipv4" | "ipv6">, {
    address: Address.$Address;
    mask: Schema.Union<[CidrBlockMask.$IPv4CidrMask, CidrBlockMask.$IPv6CidrMask]>;
}, Schema.Struct.Encoded<{
    address: Address.$Address;
    mask: Schema.Union<[CidrBlockMask.$IPv4CidrMask, CidrBlockMask.$IPv6CidrMask]>;
}>, never, {
    readonly address: {
        readonly family: "ipv4";
        readonly ip: IPv4.IPv4Brand;
    } | {
        readonly family: "ipv6";
        readonly ip: IPv6.IPv6Brand;
    };
} & {
    readonly mask: CidrBlockMask.IPv4CidrMaskBrand | CidrBlockMask.IPv6CidrMaskBrand;
}, {}, {}>;
/**
 * @since 1.0.0
 * @category Api interface
 */
export declare class CidrBlockBase<_Family extends Family.Family> extends CidrBlockBase_base {
    /** @since 1.0.0 */
    readonly family: Family.Family;
    /**
     * The first address in the range given by this address' subnet, often
     * referred to as the Network Address.
     *
     * @since 1.0.0
     */
    protected get networkAddressAsBigint(): Effect.Effect<_Family extends IPv4.IPv4Family ? IPv4.IPv4BigintBrand : _Family extends IPv6.IPv6Family ? IPv6.IPv6BigintBrand : never, ParseResult.ParseError, never>;
    /**
     * The first address in the range given by this address' subnet, often
     * referred to as the Network Address.
     *
     * @since 1.0.0
     */
    networkAddress(): _Family extends IPv4.IPv4Family ? Effect.Effect<IPv4.IPv4, ParseResult.ParseError, never> : _Family extends IPv6.IPv6Family ? Effect.Effect<IPv6.IPv6, ParseResult.ParseError, never> : never;
    /**
     * The last address in the range given by this address' subnet, often
     * referred to as the Broadcast Address.
     *
     * @since 1.0.0
     */
    protected get broadcastAddressAsBigint(): Effect.Effect<_Family extends IPv4.IPv4Family ? IPv4.IPv4BigintBrand : _Family extends IPv6.IPv6Family ? IPv6.IPv6BigintBrand : never, ParseResult.ParseError, never>;
    /**
     * The last address in the range given by this address' subnet, often
     * referred to as the Broadcast Address.
     *
     * @since 1.0.0
     */
    broadcastAddress(): _Family extends IPv4.IPv4Family ? Effect.Effect<IPv4.IPv4, ParseResult.ParseError, never> : _Family extends IPv6.IPv6Family ? Effect.Effect<IPv6.IPv6, ParseResult.ParseError, never> : never;
    /**
     * A stream of all addresses in the range given by this address' subnet.
     *
     * @since 1.0.0
     */
    get range(): _Family extends IPv4.IPv4Family ? Stream.Stream<IPv4.IPv4, ParseResult.ParseError, never> : _Family extends IPv6.IPv6Family ? Stream.Stream<IPv6.IPv6, ParseResult.ParseError, never> : never;
    /**
     * The total number of addresses in the range given by this address' subnet.
     *
     * @since 1.0.0
     */
    get total(): Effect.Effect<bigint, ParseResult.ParseError, never>;
    /**
     * Finds the smallest CIDR block that contains all the given IP addresses.
     *
     * @since 1.0.0
     */
    static readonly cidrBlockForRange: <_Family_1 extends Family.Family>(inputs: _Family_1 extends IPv4.IPv4Family ? Array.NonEmptyReadonlyArray<IPv4.IPv4> : Array.NonEmptyReadonlyArray<IPv6.IPv6>) => _Family_1 extends IPv4.IPv4Family ? Effect.Effect<CidrBlockBase<"ipv4">, ParseResult.ParseError, never> : Effect.Effect<CidrBlockBase<"ipv6">, ParseResult.ParseError, never>;
}
/**
 * @since 1.0.0
 * @category Api interface
 */
export interface $IPv4CidrBlock extends Schema.Annotable<$IPv4CidrBlock, CidrBlockBase<"ipv4">, {
    readonly address: string;
    readonly mask: number;
}, never> {
}
/**
 * @since 1.0.0
 * @category Decoded types
 */
export type IPv4CidrBlock = CidrBlockBase<"ipv4">;
/**
 * @since 1.0.0
 * @category Encoded types
 */
export type IPv4CidrBlockEncoded = Schema.Schema.Encoded<$IPv4CidrBlock>;
/**
 * @since 1.0.0
 * @category Schemas
 */
export declare const IPv4CidrBlock: $IPv4CidrBlock;
/**
 * @since 1.0.0
 * @category Api interface
 */
export interface $IPv4CidrBlockFromString extends Schema.Annotable<$IPv4CidrBlockFromString, CidrBlockBase<"ipv4">, `${string}/${number}`, never> {
}
/**
 * @since 1.0.0
 * @category Decoded types
 */
export type IPv4CidrBlockFromString = Schema.Schema.Type<$IPv4CidrBlockFromString>;
/**
 * @since 1.0.0
 * @category Encoded types
 */
export type IPv4CidrBlockFromStringEncoded = Schema.Schema.Encoded<$IPv4CidrBlockFromString>;
/**
 * A schema that transforms a `string` into a `CidrBlock`.
 *
 * @since 1.0.0
 * @category Schemas
 */
export declare const IPv4CidrBlockFromString: $IPv4CidrBlockFromString;
/**
 * @since 1.0.0
 * @category Api interface
 */
export interface $IPv6CidrBlock extends Schema.transformOrFail<Schema.Struct<{
    address: IPv6.$IPv6;
    mask: CidrBlockMask.$IPv6CidrMask;
}>, typeof CidrBlockBase<"ipv6">, never> {
}
/**
 * @since 1.0.0
 * @category Decoded types
 */
export type IPv6CidrBlock = CidrBlockBase<"ipv6">;
/**
 * @since 1.0.0
 * @category Encoded types
 */
export type IPv6CidrBlockEncoded = Schema.Schema.Encoded<$IPv6CidrBlock>;
/**
 * @since 1.0.0
 * @category Schemas
 */
export declare const IPv6CidrBlock: $IPv6CidrBlock;
/**
 * @since 1.0.0
 * @category Api interface
 */
export interface $IPv6CidrBlockFromString extends Schema.Annotable<$IPv6CidrBlockFromString, CidrBlockBase<"ipv6">, `${string}/${number}`, never> {
}
/**
 * @since 1.0.0
 * @category Decoded types
 */
export type IPv6CidrBlockFromString = Schema.Schema.Type<$IPv6CidrBlockFromString>;
/**
 * @since 1.0.0
 * @category Encoded types
 */
export type IPv6CidrBlockFromStringEncoded = Schema.Schema.Encoded<$IPv6CidrBlockFromString>;
/**
 * A schema that transforms a `string` into a `CidrBlock`.
 *
 * @since 1.0.0
 * @category Schemas
 */
export declare const IPv6CidrBlockFromString: $IPv6CidrBlockFromString;
/**
 * @since 1.0.0
 * @category Api interface
 */
export interface $CidrBlock extends Schema.Union<[$IPv4CidrBlock, $IPv6CidrBlock]> {
}
/**
 * @since 1.0.0
 * @category Schemas
 */
export declare const CidrBlock: $CidrBlock;
/**
 * @since 1.0.0
 * @category Api interface
 */
export interface $CidrBlockFromString extends Schema.Annotable<$CidrBlockFromString, CidrBlockBase<"ipv4"> | CidrBlockBase<"ipv6">, `${string}/${number}`, never> {
}
/**
 * @since 1.0.0
 * @category Decoded types
 */
export type CidrBlockFromString = Schema.Schema.Type<$CidrBlockFromString>;
/**
 * @since 1.0.0
 * @category Encoded types
 */
export type CidrBlockFromStringEncoded = Schema.Schema.Encoded<$CidrBlockFromString>;
/**
 * A schema that transforms a `string` into a `CidrBlock`.
 *
 * @since 1.0.0
 * @category Schemas
 */
export declare const CidrBlockFromString: $CidrBlockFromString;
export {};
//# sourceMappingURL=cidrBlock.d.ts.map