From 8aa958e99299df8c71e7451708ecb9dd7103545b Mon Sep 17 00:00:00 2001 From: Collection50 Date: Fri, 31 May 2024 15:58:45 +0900 Subject: [PATCH 01/11] =?UTF-8?q?feat:=20=EC=A0=95=EC=88=98,=20=EC=9E=90?= =?UTF-8?q?=EC=97=B0=EC=88=98=20=ED=83=80=EC=9E=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/types/src/Integer/index.ts | 5 +++++ packages/types/src/NaturalNumber/index.ts | 7 +++++++ packages/types/src/index.ts | 2 ++ 3 files changed, 14 insertions(+) create mode 100644 packages/types/src/Integer/index.ts create mode 100644 packages/types/src/NaturalNumber/index.ts diff --git a/packages/types/src/Integer/index.ts b/packages/types/src/Integer/index.ts new file mode 100644 index 000000000..84f132124 --- /dev/null +++ b/packages/types/src/Integer/index.ts @@ -0,0 +1,5 @@ +export type Integer = `${T}` extends + | `${string}.${string}` + | 'NaN' + ? never + : T; diff --git a/packages/types/src/NaturalNumber/index.ts b/packages/types/src/NaturalNumber/index.ts new file mode 100644 index 000000000..5dce9b7eb --- /dev/null +++ b/packages/types/src/NaturalNumber/index.ts @@ -0,0 +1,7 @@ +import { Integer } from 'Integer'; + +export type NaturalNumber = Integer extends never + ? never + : `${T}` extends `-${string}` | '0' + ? never + : T; diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index ad085a2a0..96379feff 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -8,3 +8,5 @@ export * from './Nullable'; export * from './ObjectEntries'; export * from './ObjectKeys'; export * from './Promiseable'; +export * from './Integer'; +export * from './NaturalNumber'; From d81502106bc4c56e552ae85197c29a076bcdf46f Mon Sep 17 00:00:00 2001 From: Collection50 Date: Fri, 31 May 2024 15:59:33 +0900 Subject: [PATCH 02/11] =?UTF-8?q?feat:=20chunk=20=EC=9C=A0=ED=8B=B8=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/utils/src/array/chunk/chunk.spec.ts | 34 ++++++++++++++++++++ packages/utils/src/array/chunk/index.ts | 10 ++++++ packages/utils/src/array/index.ts | 1 + 3 files changed, 45 insertions(+) create mode 100644 packages/utils/src/array/chunk/chunk.spec.ts create mode 100644 packages/utils/src/array/chunk/index.ts diff --git a/packages/utils/src/array/chunk/chunk.spec.ts b/packages/utils/src/array/chunk/chunk.spec.ts new file mode 100644 index 000000000..caa40f25f --- /dev/null +++ b/packages/utils/src/array/chunk/chunk.spec.ts @@ -0,0 +1,34 @@ +import { chunk } from '../chunk'; + +describe('chunk', () => { + test('배열을 2번째 매개변수만큼 자른다.', () => { + const arr1 = [1, 2, 3, 4, 5, 6]; + expect(chunk(arr1, 1)).toEqual([[1], [2], [3], [4], [5], [6]]); + expect(chunk(arr1, 2)).toEqual([ + [1, 2], + [3, 4], + [5, 6], + ]); + + const arr2 = [1, 2, 3, 4, 5]; + expect(chunk(arr2, 3)).toEqual([ + [1, 2, 3], + [4, 5], + ]); + }); + + test('2번째 매개변수가 1일 때 각 요소의 배열을 반환합니다', () => { + const arr = [1, 2, 3, 4, 5, 6]; + expect(chunk(arr, 1)).toEqual([[1], [2], [3], [4], [5], [6]]); + }); + + test('빈 배열이 주어지는 경우 빈 배열을 반환한다.', () => { + const arr = [] as []; + expect(chunk(arr, 3)).toEqual([]); + }); + + test('배열의 길이보다 크게 자르는 경우 배열을 그대로 담아 반환한다.', () => { + const arr = [1, 2]; + expect(chunk(arr, 3)).toEqual([arr]); + }); +}); diff --git a/packages/utils/src/array/chunk/index.ts b/packages/utils/src/array/chunk/index.ts new file mode 100644 index 000000000..9fbce7f54 --- /dev/null +++ b/packages/utils/src/array/chunk/index.ts @@ -0,0 +1,10 @@ +import { NaturalNumber } from '@modern-kit/types'; + +export const chunk = (array: T[], size: NaturalNumber): any[][] => { + return array.reduce((result, _, index) => { + if (index % size === 0) { + return [...result, array.slice(index, index + size)]; + } + return result; + }, [] as T[][]); +}; diff --git a/packages/utils/src/array/index.ts b/packages/utils/src/array/index.ts index 73371f12b..6a5b137ba 100644 --- a/packages/utils/src/array/index.ts +++ b/packages/utils/src/array/index.ts @@ -1,2 +1,3 @@ export * from './countOccurrencesInArray'; export * from './excludeElements'; +export * from './chunk'; From bf4b6034b7997a56cead9b8b16d49a71bd78787a Mon Sep 17 00:00:00 2001 From: Collection50 Date: Fri, 31 May 2024 18:23:38 +0900 Subject: [PATCH 03/11] =?UTF-8?q?fix:=20chunk=EC=9D=98=202=EB=B2=88?= =?UTF-8?q?=EC=A7=B8=20=EC=9D=B8=EC=88=98=EC=9D=98=20=EC=A0=9C=EB=84=A4?= =?UTF-8?q?=EB=A6=AD=20=ED=83=80=EC=9E=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/utils/src/array/chunk/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/utils/src/array/chunk/index.ts b/packages/utils/src/array/chunk/index.ts index 9fbce7f54..0c6ba22e4 100644 --- a/packages/utils/src/array/chunk/index.ts +++ b/packages/utils/src/array/chunk/index.ts @@ -1,6 +1,9 @@ import { NaturalNumber } from '@modern-kit/types'; -export const chunk = (array: T[], size: NaturalNumber): any[][] => { +export const chunk = ( + array: T[], + size: NaturalNumber +): T[][] => { return array.reduce((result, _, index) => { if (index % size === 0) { return [...result, array.slice(index, index + size)]; From 0599eb93c29a22baee389578b52e202799917073 Mon Sep 17 00:00:00 2001 From: Collection50 Date: Fri, 31 May 2024 18:23:57 +0900 Subject: [PATCH 04/11] =?UTF-8?q?feat:=20=EB=B2=94=EC=9E=90=EC=97=B0?= =?UTF-8?q?=EC=88=98=20=ED=83=80=EC=9E=85=EC=9D=B8=20WholeNumber=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/types/src/WholeNumber/index.ts | 7 +++++++ packages/types/src/index.ts | 1 + 2 files changed, 8 insertions(+) create mode 100644 packages/types/src/WholeNumber/index.ts diff --git a/packages/types/src/WholeNumber/index.ts b/packages/types/src/WholeNumber/index.ts new file mode 100644 index 000000000..e38d420f6 --- /dev/null +++ b/packages/types/src/WholeNumber/index.ts @@ -0,0 +1,7 @@ +import { Integer } from 'Integer'; + +export type WholeNumber = Integer extends never + ? never + : `${T}` extends `-${string}` + ? never + : T; diff --git a/packages/types/src/index.ts b/packages/types/src/index.ts index 96379feff..9eff652fc 100644 --- a/packages/types/src/index.ts +++ b/packages/types/src/index.ts @@ -10,3 +10,4 @@ export * from './ObjectKeys'; export * from './Promiseable'; export * from './Integer'; export * from './NaturalNumber'; +export * from './WholeNumber'; From c48fcf08ba694804a541cabd8c9d2a1723e7f9f5 Mon Sep 17 00:00:00 2001 From: Collection50 Date: Fri, 31 May 2024 20:07:12 +0900 Subject: [PATCH 05/11] =?UTF-8?q?fix:=20array.length,=20size=EA=B0=80=200?= =?UTF-8?q?=EC=9D=B8=20=EA=B2=BD=EC=9A=B0,=20size=20>=3D=20array.length?= =?UTF-8?q?=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=EC=9D=98=20early=20return=20?= =?UTF-8?q?=EA=B5=AC=EB=AC=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/utils/src/array/chunk/index.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/utils/src/array/chunk/index.ts b/packages/utils/src/array/chunk/index.ts index 0c6ba22e4..4f6239639 100644 --- a/packages/utils/src/array/chunk/index.ts +++ b/packages/utils/src/array/chunk/index.ts @@ -4,6 +4,14 @@ export const chunk = ( array: T[], size: NaturalNumber ): T[][] => { + if (array.length === 0 || size === 0) { + return []; + } + + if (size >= array.length) { + return [array]; + } + return array.reduce((result, _, index) => { if (index % size === 0) { return [...result, array.slice(index, index + size)]; From 229b12975aacece052948f9f8b704bb91d5e918c Mon Sep 17 00:00:00 2001 From: Collection50 Date: Fri, 31 May 2024 22:11:18 +0900 Subject: [PATCH 06/11] =?UTF-8?q?test:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=EB=A5=BC=20=ED=95=9C=EA=B8=80=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=98=81=EC=96=B4=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/utils/src/array/chunk/chunk.spec.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/utils/src/array/chunk/chunk.spec.ts b/packages/utils/src/array/chunk/chunk.spec.ts index caa40f25f..15ba4208b 100644 --- a/packages/utils/src/array/chunk/chunk.spec.ts +++ b/packages/utils/src/array/chunk/chunk.spec.ts @@ -1,7 +1,7 @@ import { chunk } from '../chunk'; describe('chunk', () => { - test('배열을 2번째 매개변수만큼 자른다.', () => { + it('splits the array according to the second parameter', () => { const arr1 = [1, 2, 3, 4, 5, 6]; expect(chunk(arr1, 1)).toEqual([[1], [2], [3], [4], [5], [6]]); expect(chunk(arr1, 2)).toEqual([ @@ -17,18 +17,23 @@ describe('chunk', () => { ]); }); - test('2번째 매개변수가 1일 때 각 요소의 배열을 반환합니다', () => { + it('returns an array of each element when the second parameter is 1', () => { const arr = [1, 2, 3, 4, 5, 6]; expect(chunk(arr, 1)).toEqual([[1], [2], [3], [4], [5], [6]]); }); - test('빈 배열이 주어지는 경우 빈 배열을 반환한다.', () => { + it('returns an empty array when given an empty array', () => { const arr = [] as []; expect(chunk(arr, 3)).toEqual([]); }); - test('배열의 길이보다 크게 자르는 경우 배열을 그대로 담아 반환한다.', () => { + it('returns the array as is if the chunk size is greater than the length of the array', () => { const arr = [1, 2]; expect(chunk(arr, 3)).toEqual([arr]); }); + + it('returns an empty array if the second parameter is 0', () => { + const arr = [1, 2]; + expect(chunk(arr, 0 as number)).toEqual([]); + }); }); From 338406fcc01fbb2ee5b36763c097153a2023481d Mon Sep 17 00:00:00 2001 From: Collection50 Date: Fri, 31 May 2024 23:26:28 +0900 Subject: [PATCH 07/11] =?UTF-8?q?fix:=20size=EA=B0=80=20NaN=EC=9D=B8?= =?UTF-8?q?=EC=A7=80=20=ED=99=95=EC=9D=B8=ED=95=98=EB=8A=94=20early=20retu?= =?UTF-8?q?rn=20=EA=B5=AC=EB=AC=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/utils/src/array/chunk/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/utils/src/array/chunk/index.ts b/packages/utils/src/array/chunk/index.ts index 4f6239639..caeac9dc7 100644 --- a/packages/utils/src/array/chunk/index.ts +++ b/packages/utils/src/array/chunk/index.ts @@ -4,6 +4,10 @@ export const chunk = ( array: T[], size: NaturalNumber ): T[][] => { + if (Number.isNaN(size)) { + return [array]; + } + if (array.length === 0 || size === 0) { return []; } @@ -14,7 +18,7 @@ export const chunk = ( return array.reduce((result, _, index) => { if (index % size === 0) { - return [...result, array.slice(index, index + size)]; + result.push(array.slice(index, index + size)); } return result; }, [] as T[][]); From 4fc45dfc25020471219a120251df03c26dc65294 Mon Sep 17 00:00:00 2001 From: Collection50 Date: Sat, 1 Jun 2024 01:27:31 +0900 Subject: [PATCH 08/11] =?UTF-8?q?fix:=20size=EA=B0=80=20NaN=EC=9D=B8=20?= =?UTF-8?q?=EA=B2=BD=EC=9A=B0=20=EB=B9=88=20=EB=B0=B0=EC=97=B4=EC=9D=84=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/utils/src/array/chunk/chunk.spec.ts | 5 +++++ packages/utils/src/array/chunk/index.ts | 6 +----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/utils/src/array/chunk/chunk.spec.ts b/packages/utils/src/array/chunk/chunk.spec.ts index 15ba4208b..2c6c3286b 100644 --- a/packages/utils/src/array/chunk/chunk.spec.ts +++ b/packages/utils/src/array/chunk/chunk.spec.ts @@ -36,4 +36,9 @@ describe('chunk', () => { const arr = [1, 2]; expect(chunk(arr, 0 as number)).toEqual([]); }); + + it('returns an empty array if the second parameter is NaN', () => { + const arr = [1, 2]; + expect(chunk(arr, NaN)).toEqual([]); + }); }); diff --git a/packages/utils/src/array/chunk/index.ts b/packages/utils/src/array/chunk/index.ts index caeac9dc7..193c4c159 100644 --- a/packages/utils/src/array/chunk/index.ts +++ b/packages/utils/src/array/chunk/index.ts @@ -4,11 +4,7 @@ export const chunk = ( array: T[], size: NaturalNumber ): T[][] => { - if (Number.isNaN(size)) { - return [array]; - } - - if (array.length === 0 || size === 0) { + if (array.length === 0 || Number.isNaN(size) || size === 0) { return []; } From 471f39c61d651a0340eeb046ef7b6dcf2e30cde3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gromit=20=28=EC=A0=84=EB=AF=BC=EC=9E=AC=29?= <64779472+ssi02014@users.noreply.github.com> Date: Sat, 1 Jun 2024 01:40:00 +0900 Subject: [PATCH 09/11] chore: Create loud-zebras-shave.md --- .changeset/loud-zebras-shave.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/loud-zebras-shave.md diff --git a/.changeset/loud-zebras-shave.md b/.changeset/loud-zebras-shave.md new file mode 100644 index 000000000..029de6662 --- /dev/null +++ b/.changeset/loud-zebras-shave.md @@ -0,0 +1,6 @@ +--- +"@modern-kit/types": minor +"@modern-kit/utils": minor +--- + +feat(utils): chunk 유틸 함수 추가 및 Interger, NaturalNumber WholeNumber 유틸 타입 추가 From b48d5c83d5a17749cac0498552b11570d636729e Mon Sep 17 00:00:00 2001 From: Collection50 Date: Sat, 1 Jun 2024 01:47:34 +0900 Subject: [PATCH 10/11] =?UTF-8?q?docs:=20chunk=20=EC=9C=A0=ED=8B=B8=20?= =?UTF-8?q?=ED=95=A8=EC=88=98=EC=9D=98=20=EB=AC=B8=EC=84=9C=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/docs/utils/array/chunk.md | 44 ++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 docs/docs/utils/array/chunk.md diff --git a/docs/docs/utils/array/chunk.md b/docs/docs/utils/array/chunk.md new file mode 100644 index 000000000..f7cb350b1 --- /dev/null +++ b/docs/docs/utils/array/chunk.md @@ -0,0 +1,44 @@ +# chunk + +주어진 배열을 지정된 `size`만큼의 작은 배열로 나누어 반환하는 유틸리티 함수입니다. +`size === 0` 이거나 배열이 비어있는 경우 빈 배열을 반환하며, `size <= array.length`인 경우 전체 배열을 하나의 배열로 감싸서 반환합니다. + +## Code + +[🔗 실제 구현 코드 확인](https://github.com/modern-agile-team/modern-kit/blob/main/packages/utils/src/array/chunk/index.ts) + +## Interface + +```ts title="typescript" +const chunk = ( + array: T[], + size: NaturalNumber +): T[][] +``` + +## Usage + +```ts title="typescript" +import { chunk } from '@modern-kit/utils'; + +const array1 = [1, 2, 3, 4, 5]; +const size1 = 2; +chunk(array1, size1); // [[1, 2], [3, 4], [5]] + +const array2 = ['a', 'b', 'c', 'd']; +const size2 = 3; +chunk(array2, size2); // [['a', 'b', 'c'], ['d']] + +const array3 = [1, 2, 3, 4]; +const size3 = 5; +chunk(array3, size3); // [[1, 2, 3, 4]] + +const array4 = []; +const size4 = 2; +chunk(array4, size4); // [] +``` + +## Caveats +`size`는 `1` 이상의 자연수여야 합니다. `NaturalNumber` 타입을 사용하여 이를 강제합니다. +`size === 0`이거나 `size === NaN`일 경우 빈 배열을 반환합니다. +`size < array.length`인 경우 전체 배열을 하나의 배열로 감싸서 반환합니다. From e61b7c08caa1a9aaab30613143fe21a17f52a708 Mon Sep 17 00:00:00 2001 From: Collection50 Date: Sat, 1 Jun 2024 01:48:32 +0900 Subject: [PATCH 11/11] =?UTF-8?q?fix:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20NaN=20=ED=83=80=EC=9E=85=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/types/src/Integer/index.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/types/src/Integer/index.ts b/packages/types/src/Integer/index.ts index 84f132124..e76b0ba38 100644 --- a/packages/types/src/Integer/index.ts +++ b/packages/types/src/Integer/index.ts @@ -1,5 +1,3 @@ -export type Integer = `${T}` extends - | `${string}.${string}` - | 'NaN' +export type Integer = `${T}` extends `${string}.${string}` ? never : T;