Skip to content

Commit

Permalink
✨ Add NN function
Browse files Browse the repository at this point in the history
  • Loading branch information
TomokiMiyauci committed May 9, 2021
1 parent 401328c commit 28dc49a
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 0 deletions.
1 change: 1 addition & 0 deletions api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ const api: Api = {
lt: ['ramda', 'lodash'],
lte: ['ramda', 'lodash'],
not: LAMBDAS,
NN: {},
or: LAMBDAS,
prepend: LAMBDAS,
product: LAMBDAS,
Expand Down
1 change: 1 addition & 0 deletions mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ export { lt } from './src/lt.ts'
export { lte } from './src/lte.ts'
export { map } from './src/map.ts'
export { multiply } from './src/multiply.ts'
export { NN } from './src/NN.ts'
export { not } from './src/not.ts'
export { or } from './src/or.ts'
export { prepend } from './src/prepend.ts'
Expand Down
35 changes: 35 additions & 0 deletions src/NN.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Copyright 2021-present the Fonction authors. All rights reserved. MIT license.
import { Falsy } from './types/index.ts'
/**
* Abbreviation for Not Not. Returns the `!!` of its argument.
*
* @param val - Input any value
* @returns The result of `!!val`
*
* @remarks
* The Definition of Falsy
* - `''`
* - `false`
* - `0`
* - `NaN`
* - `undefined`
* - `null`
*
* @example
* ```ts
* NN('') // false
* NN(false) // false
* NN(0) // false
* NN(NaN) // false
* NN(undefined) // false
* NN(null) // false
*
* NN({}) // true
* NN([]) // true
* ```
*
* @public
*/
const NN = <T>(val: T): T extends Falsy ? false : boolean =>
!!val as T extends Falsy ? false : boolean
export { NN }
40 changes: 40 additions & 0 deletions test/NN.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Copyright 2021-present the Fonction authors. All rights reserved. MIT license.
import { assertEquals } from '../deps.ts'
import { NN } from '../src/NN.ts'
import { assertEqual } from './asserts.ts'

Deno.test('NN', () => {
const table: [unknown, boolean][] = [
['', false],
[undefined, false],
[null, false],
[0, false],
[NaN, false],
[false, false],
[[], true],
[{}, true],
['hello', true],
[Infinity, true],
[1, true],
[-1, true],
[true, true]
]

table.forEach(([val, expected]) => {
assertEquals(NN(val), expected, `NN(${val}) -> ${expected}`)
})

assertEqual<false>(NN('' as const))
assertEqual<false>(NN(0 as const))
assertEqual<false>(NN(false as const))
assertEqual<false>(NN(undefined))
assertEqual<false>(NN(null))
assertEqual<boolean>(NN(String))
assertEqual<boolean>(NN(Number))
assertEqual<boolean>(NN(NaN))
assertEqual<boolean>(NN(BigInt))
assertEqual<boolean>(NN(Symbol))
assertEqual<boolean>(NN(Date))
assertEqual<boolean>(NN(Object))
assertEqual<boolean>(NN(Array))
})

0 comments on commit 28dc49a

Please sign in to comment.