Skip to content

Commit 8af0abd

Browse files
committed
Guard TakeLeft Function
1 parent 6462825 commit 8af0abd

2 files changed

Lines changed: 24 additions & 2 deletions

File tree

src/guard/guard.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,8 +185,8 @@ export function EveryAll<T>(value: T[], offset: number, callback: (value: T, ind
185185
// ------------------------------------------------------------------
186186
export type TakeLeftTrue<T> = (left: T, right: T[]) => unknown
187187
export type TakeLeftFalse = () => unknown
188-
export function TakeLeft<T>(array: T[], true_: TakeLeftTrue<T>, false_: TakeLeftFalse): unknown {
189-
return IsEqual(array.length, 0) ? false_() : true_(array[0], array.slice(1))
188+
export function TakeLeft<T, True extends TakeLeftTrue<T>, False extends TakeLeftFalse>(array: T[], true_: True, false_: False): ReturnType<True> | ReturnType<False> {
189+
return (IsEqual(array.length, 0) ? false_() : true_(array[0], array.slice(1))) as never
190190
}
191191
// --------------------------------------------------------------------------
192192
// Object

test/typebox/runtime/guard/guard.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,3 +324,25 @@ Test('Should IsClassInstance 15', () => {
324324
const strObj = new String('abc')
325325
Assert.IsEqual(Guard.IsClassInstance(strObj), true)
326326
})
327+
328+
// ------------------------------------------------------------------
329+
// Guard.TakeLeft
330+
// ------------------------------------------------------------------
331+
Test('Should TakeLeft 1', () => {
332+
const result: any = Guard.TakeLeft([], (left, right) => ({ left, right }), () => 'empty')
333+
Assert.IsEqual(result, 'empty')
334+
})
335+
Test('Should TakeLeft 2', () => {
336+
const result: string | {
337+
left: number
338+
right: number[]
339+
} = Guard.TakeLeft([1, 2, 3], (left, right) => ({ left, right }), () => 'empty')
340+
Assert.IsEqual(result, { left: 1, right: [2, 3] })
341+
})
342+
Test('Should TakeLeft 3', () => {
343+
const result: string | {
344+
left: number
345+
right: number[]
346+
} = Guard.TakeLeft([42], (left, right) => ({ left, right }), () => 'empty')
347+
Assert.IsEqual(result, { left: 42, right: [] })
348+
})

0 commit comments

Comments
 (0)