function cidrSubtract
cidrSubtract<T extends Cidr>(
a: T,
b: T extends Cidrv4 ? Cidrv4 : Cidrv6
): (T extends Cidrv4 ? Cidrv4 : Cidrv6)[]

Subtracts one CIDR block from another.

Dispatches to cidrv4Subtract or cidrv6Subtract based on the address type. Throws TypeError when mixing IPv4 and IPv6 CIDRs. The result matches the dialect of the inputs, and is masked when they disagree (ADR 0006).

Examples

IPv4 subtraction

import { assertEquals } from "@std/assert";
import { cidrSubtract, parseCidr, stringifyCidr } from "@hertzg/ip/cidr";

const result = cidrSubtract(parseCidr("10.0.0.0/24"), parseCidr("172.16.0.0/24"));
assertEquals(result.map((c) => stringifyCidr(c)), ["10.0.0.0/24"]);

IPv6 subtraction

import { assertEquals } from "@std/assert";
import { cidrSubtract, parseCidr, stringifyCidr } from "@hertzg/ip/cidr";

const result = cidrSubtract(parseCidr("2001:db8::/32"), parseCidr("2001:db9::/32"));
assertEquals(result.map((c) => stringifyCidr(c)), ["2001:db8::/32"]);

Mixed versions throw TypeError

import { assertThrows } from "@std/assert";
import { cidrSubtract, parseCidr } from "@hertzg/ip/cidr";

assertThrows(
  () => cidrSubtract(parseCidr("10.0.0.0/8"), parseCidr("2001:db8::/32")),
  TypeError,
);

Type Parameters

T extends Cidr

Parameters

a: T

The CIDR block to subtract from

b: T extends Cidrv4 ? Cidrv4 : Cidrv6

The CIDR block to subtract

Return Type

(T extends Cidrv4 ? Cidrv4 : Cidrv6)[]

Array of CIDR blocks covering a minus b

Throws

TypeError

If the two CIDRs are different IP versions