diff --git a/.changeset/tricky-oranges-melt.md b/.changeset/tricky-oranges-melt.md new file mode 100644 index 0000000000..2d31047195 --- /dev/null +++ b/.changeset/tricky-oranges-melt.md @@ -0,0 +1,5 @@ +--- +"effect": minor +--- + +Add an `isRegExp` type guard diff --git a/packages/effect/dtslint/Predicate.ts b/packages/effect/dtslint/Predicate.ts index d7d3a4db25..eee9006e29 100644 --- a/packages/effect/dtslint/Predicate.ts +++ b/packages/effect/dtslint/Predicate.ts @@ -194,6 +194,13 @@ if (Predicate.isTupleOfAtLeast(unknowns, 3)) { unknowns } +// ------------------------------------------------------------------------------------- +// isRegExp +// ------------------------------------------------------------------------------------- + +// $ExpectType RegExp[] +unknowns.filter(Predicate.isRegExp) + // ------------------------------------------------------------------------------------- // compose // ------------------------------------------------------------------------------------- diff --git a/packages/effect/src/Predicate.ts b/packages/effect/src/Predicate.ts index 1646a1a9c3..0fbc6f3bf8 100644 --- a/packages/effect/src/Predicate.ts +++ b/packages/effect/src/Predicate.ts @@ -665,6 +665,22 @@ export const isPromiseLike = ( input: unknown ): input is PromiseLike => hasProperty(input, "then") && isFunction(input.then) +/** + * Tests if a value is a `RegExp`. + * + * @param input - The value to test. + * + * @example + * import { Predicate } from "effect" + * + * assert.deepStrictEqual(Predicate.isRegExp(/a/), true) + * assert.deepStrictEqual(Predicate.isRegExp("a"), false) + * + * @category guards + * @since 3.9.0 + */ +export const isRegExp = (input: unknown): input is RegExp => input instanceof RegExp + /** * @since 2.0.0 */ diff --git a/packages/effect/src/RegExp.ts b/packages/effect/src/RegExp.ts index 36ce61d6a2..374a2d5b49 100644 --- a/packages/effect/src/RegExp.ts +++ b/packages/effect/src/RegExp.ts @@ -3,6 +3,23 @@ * * @since 2.0.0 */ +import * as predicate from "./Predicate.js" + +/** + * Tests if a value is a `RegExp`. + * + * @param input - The value to test. + * + * @example + * import { RegExp } from "effect" + * + * assert.deepStrictEqual(RegExp.isRegExp(/a/), true) + * assert.deepStrictEqual(RegExp.isRegExp("a"), false) + * + * @category guards + * @since 3.9.0 + */ +export const isRegExp: (input: unknown) => input is RegExp = predicate.isRegExp /** * Escapes special characters in a regular expression pattern. diff --git a/packages/effect/test/Predicate.test.ts b/packages/effect/test/Predicate.test.ts index 8f0316b2b7..b90676244a 100644 --- a/packages/effect/test/Predicate.test.ts +++ b/packages/effect/test/Predicate.test.ts @@ -334,4 +334,10 @@ describe("Predicate", () => { assert.deepStrictEqual(_.isTupleOfAtLeast([1, 2, 3], 2), true) assert.deepStrictEqual(_.isTupleOfAtLeast([1, 2, 3], 4), false) }) + + it("isRegExp", () => { + assert.deepStrictEqual(_.isRegExp(/a/), true) + assert.deepStrictEqual(_.isRegExp(null), false) + assert.deepStrictEqual(_.isRegExp("a"), false) + }) }) diff --git a/packages/effect/test/RegExp.test.ts b/packages/effect/test/RegExp.test.ts index 38844c1953..b39ceab0d0 100644 --- a/packages/effect/test/RegExp.test.ts +++ b/packages/effect/test/RegExp.test.ts @@ -2,6 +2,12 @@ import * as RegExp from "effect/RegExp" import { describe, expect, it } from "vitest" describe("RegExp", () => { + it("isRegExp", () => { + expect(RegExp.isRegExp(/a/)).toEqual(true) + expect(RegExp.isRegExp(null)).toEqual(false) + expect(RegExp.isRegExp("a")).toEqual(false) + }) + describe("escape", () => { it("should escape special characters correctly", () => { const testCases: Array<[string, string]> = [