From b31ab62e8ff31d9e49c4a0f96b750df9d4352d05 Mon Sep 17 00:00:00 2001 From: Katarina Anton Date: Sun, 14 May 2023 18:19:24 +0200 Subject: [PATCH] feat(partition): add support for type guards --- snapshots/partition.ts | 7 +++++++ snapshots/ramda-tests.ts | 2 ++ templates/partition.d.ts | 4 ++++ templates/partition.md | 3 +++ tests/__snapshots__/partition.ts.snap | 4 ++++ tests/__snapshots__/ramda-tests.ts.snap | 2 ++ tests/partition.ts | 7 +++++++ tests/ramda-tests.ts | 2 ++ 8 files changed, 31 insertions(+) diff --git a/snapshots/partition.ts b/snapshots/partition.ts index 9ce8321..5b50b94 100644 --- a/snapshots/partition.ts +++ b/snapshots/partition.ts @@ -7,6 +7,8 @@ declare const a_1_b_2_c_3: { b: 2; c: 3; }; +declare const number_type_guard: (x: unknown) => x is number; +declare const unknown_array: unknown[]; // @dts-jest:pass:snap -> [number[], number[]] R.partition(number_to_boolean)(number_array); @@ -17,3 +19,8 @@ R.partition(number_to_boolean, number_array); R.partition(number_to_boolean)(a_1_b_2_c_3); // @dts-jest:pass:snap -> [Partial<{ a: 1; b: 2; c: 3; }>, Partial<{ a: 1; b: 2; c: 3; }>] R.partition(number_to_boolean, a_1_b_2_c_3); + +// @dts-jest:pass:snap -> [number[], unknown[]] +R.partition(number_type_guard)(unknown_array); +// @dts-jest:pass:snap -> [number[], unknown[]] +R.partition(number_type_guard, unknown_array); diff --git a/snapshots/ramda-tests.ts b/snapshots/ramda-tests.ts index 1f6a0dc..6f3b032 100644 --- a/snapshots/ramda-tests.ts +++ b/snapshots/ramda-tests.ts @@ -2173,6 +2173,8 @@ import * as R from '../ramda/dist/index'; R.partition((x: number) => x > 2, [1, 2, 3, 4]); // @dts-jest:pass:snap -> [number[], number[]] R.partition((x: number) => x > 2)([1, 2, 3, 4]); + // @dts-jest:pass:snap -> [number[], unknown[]] + R.partition((x: unknown): x is number => typeof x === 'number')([1, 'a', 2, 'b', 3, 4, 'c']); // @dts-jest:pass:snap -> [Partial<{ a: string; b: string; foo: string; }>, Partial<{ a: string; b: string; foo: string; }>] R.partition(R.contains('s'), { a: 'sss', b: 'ttt', foo: 'bars' }); //=> [ { a: 'sss', foo: 'bars' }, { b: 'ttt' } ] })(); diff --git a/templates/partition.d.ts b/templates/partition.d.ts index 2c79334..4b37799 100644 --- a/templates/partition.d.ts +++ b/templates/partition.d.ts @@ -1,5 +1,9 @@ import { Dictionary, List, Predicate } from './$types'; +export function $list( + fn: (a: T) => a is P, + list: List +): [P[], T[]]; export function $list(fn: Predicate, list: List): [T[], T[]]; export function $object>( fn: Predicate, diff --git a/templates/partition.md b/templates/partition.md index d5af4f5..ce1d430 100644 --- a/templates/partition.md +++ b/templates/partition.md @@ -20,3 +20,6 @@ that has a filter method such as `Array`. R.partition(R.contains('s'), { a: 'sss', b: 'ttt', foo: 'bars' }); // => [ { a: 'sss', foo: 'bars' }, { b: 'ttt' } ] + + R.partition((value: unknown): value is number => typeof value === 'number', ['a', 'b', 1, 2, 'c']); + // => [ [1, 2], ['a', 'b', 'c'] ] diff --git a/tests/__snapshots__/partition.ts.snap b/tests/__snapshots__/partition.ts.snap index 6d9d658..61c13e7 100644 --- a/tests/__snapshots__/partition.ts.snap +++ b/tests/__snapshots__/partition.ts.snap @@ -7,3 +7,7 @@ exports[`R.partition(number_to_boolean)(number_array) 1`] = `"[number[], number[ exports[`R.partition(number_to_boolean, a_1_b_2_c_3) 1`] = `"[Partial<{ a: 1; b: 2; c: 3; }>, Partial<{ a: 1; b: 2; c: 3; }>]"`; exports[`R.partition(number_to_boolean, number_array) 1`] = `"[number[], number[]]"`; + +exports[`R.partition(number_type_guard)(unknown_array) 1`] = `"[number[], unknown[]]"`; + +exports[`R.partition(number_type_guard, unknown_array) 1`] = `"[number[], unknown[]]"`; diff --git a/tests/__snapshots__/ramda-tests.ts.snap b/tests/__snapshots__/ramda-tests.ts.snap index 7a58413..3b03a04 100644 --- a/tests/__snapshots__/ramda-tests.ts.snap +++ b/tests/__snapshots__/ramda-tests.ts.snap @@ -1022,6 +1022,8 @@ exports[`partition R.partition((x: number) => x > 2)([1, 2, 3, 4]) 1`] = `"[numb exports[`partition R.partition((x: number) => x > 2, [1, 2, 3, 4]) 1`] = `"[number[], number[]]"`; +exports[`partition R.partition((x: unknown): x is number => typeof x === 'number')([1, 'a', 2, 'b', 3, 4, 'c']) 1`] = `"[number[], unknown[]]"`; + exports[`partition R.partition(R.contains('s'))(['sss', 'ttt', 'foo', 'bars']) 1`] = `"[R.List[], R.List[]]"`; exports[`partition R.partition(R.contains('s'), ['sss', 'ttt', 'foo', 'bars']) 1`] = `"[R.List[], R.List[]]"`; diff --git a/tests/partition.ts b/tests/partition.ts index 2fa4674..9c1a65d 100644 --- a/tests/partition.ts +++ b/tests/partition.ts @@ -7,6 +7,8 @@ declare const a_1_b_2_c_3: { b: 2; c: 3; }; +declare const number_type_guard: (x: unknown) => x is number; +declare const unknown_array: unknown[]; // @dts-jest:pass:snap R.partition(number_to_boolean)(number_array); @@ -17,3 +19,8 @@ R.partition(number_to_boolean, number_array); R.partition(number_to_boolean)(a_1_b_2_c_3); // @dts-jest:pass:snap R.partition(number_to_boolean, a_1_b_2_c_3); + +// @dts-jest:pass:snap +R.partition(number_type_guard)(unknown_array); +// @dts-jest:pass:snap +R.partition(number_type_guard, unknown_array); diff --git a/tests/ramda-tests.ts b/tests/ramda-tests.ts index e33ab29..aae7cc4 100644 --- a/tests/ramda-tests.ts +++ b/tests/ramda-tests.ts @@ -2174,6 +2174,8 @@ import * as R from '../ramda/dist/index'; // @dts-jest:pass:snap R.partition((x: number) => x > 2)([1, 2, 3, 4]); // @dts-jest:pass:snap + R.partition((x: unknown): x is number => typeof x === 'number')([1, 'a', 2, 'b', 3, 4, 'c']); + // @dts-jest:pass:snap R.partition(R.contains('s'), { a: 'sss', b: 'ttt', foo: 'bars' }); //=> [ { a: 'sss', foo: 'bars' }, { b: 'ttt' } ] })();