{"_id":"@btsheehy/tikka","_rev":"5-f01d919f2f71aa94302826af2ae28b1e","name":"@btsheehy/tikka","dist-tags":{"alpha":"1.0.0-alpha.0","latest":"2.1.0"},"versions":{"1.0.0-alpha.0":{"name":"@btsheehy/tikka","version":"1.0.0-alpha.0","keywords":["functional","programming","utilities","typescript","tree-shaking"],"author":{"name":"Brandon Sheehy","email":"dev@btsheehy.com"},"license":"GPL-3.0-or-later","_id":"@btsheehy/tikka@1.0.0-alpha.0","maintainers":[{"name":"btsheehy","email":"npm@btsheehy.com"}],"homepage":"https://github.com/btsheehy/tikka#readme","bugs":{"url":"https://github.com/btsheehy/tikka/issues"},"dist":{"shasum":"fe1d5f6cf8cfd0b29a2747c311d92c72babb2c67","tarball":"https://registry.npmjs.org/@btsheehy/tikka/-/tikka-1.0.0-alpha.0.tgz","fileCount":381,"integrity":"sha512-YMIR/zipsn7fnIlS2JvXagkpjgMRTYUy557bKb2AFg1O3TeYtKNCGgorc5IAwoG6wdC3AzgBhhLJRwW2Ght/eg==","signatures":[{"sig":"MEQCIFAT0SWFMsNs8fyD5AhiFmTUZy4asb2FunJa7nFZo9ZMAiApAAuwPuOV81qtZL+DiGzjWjL6ShuJy+Ux0LguZzYxhg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":278208},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./all":{"types":"./dist/tikka.d.ts","import":"./dist/tikka.js","require":"./dist/tikka.cjs"},"./data-first":{"types":"./dist/data-first.d.ts","import":"./dist/data-first.js","require":"./dist/data-first.cjs"},"./package.json":"./package.json"},"gitHead":"47233f55e685aa287717aec21b60eeb8b3e68cdf","scripts":{"lint":"biome check .","perf":"vitest bench test/perf/library-comparison.bench.ts test/perf/short-circuit.bench.ts test/perf/object-and-deep.bench.ts test/perf/pipe.bench.ts","test":"vitest run","build":"npm run clean && rollup -c","check":"npm run lint && npm run typecheck && npm run test && npm run build","clean":"rm -rf dist","format":"biome format . --write","lint:fix":"biome check . --write","perf:test":"sh -c 'vitest bench test/perf/library-comparison.bench.ts test/perf/short-circuit.bench.ts test/perf/object-and-deep.bench.ts test/perf/pipe.bench.ts --testNamePattern \"$1\"' --","typecheck":"tsc --noEmit","perf:watch":"vitest bench --watch test/perf/library-comparison.bench.ts test/perf/short-circuit.bench.ts test/perf/object-and-deep.bench.ts test/perf/pipe.bench.ts","test:watch":"vitest"},"_npmUser":{"name":"btsheehy","email":"npm@btsheehy.com"},"repository":{"url":"git+https://github.com/btsheehy/tikka.git","type":"git"},"_npmVersion":"11.11.0","description":"Minimal dependency-free functional programming utilities for TypeScript and JavaScript","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"ramda":"^0.32.0","tslib":"^2.8.1","lodash":"^4.17.21","rollup":"^4.52.5","vitest":"^3.2.4","typescript":"^5.9.3","@types/node":"^24.6.1","@types/ramda":"^0.31.1","@types/lodash":"^4.17.20","@biomejs/biome":"^2.4.12","@rollup/plugin-typescript":"^12.1.4"},"_npmOperationalInternal":{"tmp":"tmp/tikka_1.0.0-alpha.0_1776718241818_0.8238043111089397","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@btsheehy/tikka","version":"1.0.0","keywords":["functional","programming","utilities","typescript","tree-shaking"],"author":{"name":"Brandon Sheehy","email":"dev@btsheehy.com"},"license":"GPL-3.0-or-later","_id":"@btsheehy/tikka@1.0.0","maintainers":[{"name":"btsheehy","email":"npm@btsheehy.com"}],"homepage":"https://github.com/btsheehy/tikka#readme","bugs":{"url":"https://github.com/btsheehy/tikka/issues"},"dist":{"shasum":"8eaa396c774f57fc5d6139fb6b7b36b6e3fbff7c","tarball":"https://registry.npmjs.org/@btsheehy/tikka/-/tikka-1.0.0.tgz","fileCount":387,"integrity":"sha512-vMDNCd0WKpURfdqFGMDWxMvF210/k2/P22kSo3jQA5BtClCzbVy/ICIdDYC9e3I6ybiJK7YQC+fm9X+fwSocoQ==","signatures":[{"sig":"MEYCIQCa+QCD2SEEh53C1T3pChO8874AJ3eM4iv2JjRoiw+sCAIhAIxkY3Ux6ttvk9enlRAXgRyK8mQzCPMllb6/j1dahbDf","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":287564},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./all":{"types":"./dist/tikka.d.ts","import":"./dist/tikka.js","require":"./dist/tikka.cjs"},"./data-first":{"types":"./dist/data-first.d.ts","import":"./dist/data-first.js","require":"./dist/data-first.cjs"},"./package.json":"./package.json"},"gitHead":"21942fe04a1dd4c9c0071b013b2a374854cc5198","scripts":{"lint":"biome check .","perf":"vitest bench test/perf/library-comparison.bench.ts test/perf/short-circuit.bench.ts test/perf/object-and-deep.bench.ts test/perf/pipe.bench.ts","test":"vitest run","build":"npm run clean && rollup -c","check":"npm run lint && npm run typecheck && npm run test && npm run build","clean":"rm -rf dist","format":"biome format . --write && npm run format:md-code-blocks","lint:fix":"biome check . --write","perf:test":"sh -c 'vitest bench test/perf/library-comparison.bench.ts test/perf/short-circuit.bench.ts test/perf/object-and-deep.bench.ts test/perf/pipe.bench.ts --testNamePattern \"$1\"' --","typecheck":"tsc --noEmit","perf:watch":"vitest bench --watch test/perf/library-comparison.bench.ts test/perf/short-circuit.bench.ts test/perf/object-and-deep.bench.ts test/perf/pipe.bench.ts","test:watch":"vitest","format:md-code-blocks":"bun scripts/format-markdown-code-blocks.ts"},"_npmUser":{"name":"btsheehy","email":"npm@btsheehy.com"},"repository":{"url":"git+https://github.com/btsheehy/tikka.git","type":"git"},"_npmVersion":"11.11.0","description":"Minimal dependency-free functional programming utilities for TypeScript and JavaScript","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"ramda":"^0.32.0","tslib":"^2.8.1","lodash":"^4.17.21","rollup":"^4.52.5","vitest":"^3.2.4","typescript":"^5.9.3","@types/node":"^24.6.1","@types/ramda":"^0.31.1","@types/lodash":"^4.17.20","@biomejs/biome":"^2.4.12","@rollup/plugin-typescript":"^12.1.4"},"_npmOperationalInternal":{"tmp":"tmp/tikka_1.0.0_1776888964327_0.7124018877712099","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@btsheehy/tikka","version":"1.0.1","keywords":["functional","programming","utilities","typescript","tree-shaking"],"author":{"name":"Brandon Sheehy","email":"dev@btsheehy.com"},"license":"GPL-3.0-or-later","_id":"@btsheehy/tikka@1.0.1","maintainers":[{"name":"btsheehy","email":"npm@btsheehy.com"}],"homepage":"https://github.com/btsheehy/tikka#readme","bugs":{"url":"https://github.com/btsheehy/tikka/issues"},"dist":{"shasum":"a5bea5aae48785ebbb52cf2ca012ea375797fa72","tarball":"https://registry.npmjs.org/@btsheehy/tikka/-/tikka-1.0.1.tgz","fileCount":387,"integrity":"sha512-iIHgX7Y098YXS3vP0cR4JtDmQgu30vGn0/bn/fs3SWwbpPTLdfQ7lSo/BYzfsQELGKhJRj/JvD5xxLgAwz2wkg==","signatures":[{"sig":"MEUCIANdOfEmSgI7zVJ8LXgzaU99E1tLQua0YoxrPC0oJpGuAiEArvbzfM1wGhNvYC4EURVGP7JgL+XFpNJctul5KqtFKO8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":291724},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./all":{"types":"./dist/tikka.d.ts","import":"./dist/tikka.js","require":"./dist/tikka.cjs"},"./data-first":{"types":"./dist/data-first.d.ts","import":"./dist/data-first.js","require":"./dist/data-first.cjs"},"./package.json":"./package.json"},"gitHead":"765190b17e027738f80f1cb971f9eb8ba95828f9","scripts":{"lint":"biome check .","perf":"vitest bench test/perf/library-comparison.bench.ts test/perf/short-circuit.bench.ts test/perf/object-and-deep.bench.ts test/perf/pipe.bench.ts","test":"vitest run","build":"npm run clean && rollup -c","check":"npm run lint && npm run typecheck && npm run test && npm run build","clean":"rm -rf dist","format":"biome format . --write && npm run format:md-code-blocks","lint:fix":"biome check . --write","perf:test":"sh -c 'vitest bench test/perf/library-comparison.bench.ts test/perf/short-circuit.bench.ts test/perf/object-and-deep.bench.ts test/perf/pipe.bench.ts --testNamePattern \"$1\"' --","typecheck":"tsc --noEmit","perf:watch":"vitest bench --watch test/perf/library-comparison.bench.ts test/perf/short-circuit.bench.ts test/perf/object-and-deep.bench.ts test/perf/pipe.bench.ts","test:watch":"vitest","format:md-code-blocks":"bun scripts/format-markdown-code-blocks.ts"},"_npmUser":{"name":"btsheehy","email":"npm@btsheehy.com"},"repository":{"url":"git+https://github.com/btsheehy/tikka.git","type":"git"},"_npmVersion":"11.11.0","description":"Minimal dependency-free functional programming utilities for TypeScript and JavaScript","directories":{},"sideEffects":false,"_nodeVersion":"24.14.1","_hasShrinkwrap":false,"devDependencies":{"ramda":"^0.32.0","tslib":"^2.8.1","lodash":"^4.17.21","rollup":"^4.52.5","vitest":"^3.2.4","typescript":"^5.9.3","@types/node":"^24.6.1","@types/ramda":"^0.31.1","@types/lodash":"^4.17.20","@biomejs/biome":"^2.4.12","@rollup/plugin-typescript":"^12.1.4"},"_npmOperationalInternal":{"tmp":"tmp/tikka_1.0.1_1776891023955_0.897997427142649","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@btsheehy/tikka","version":"2.0.0","keywords":["functional","programming","utilities","typescript","tree-shaking"],"author":{"name":"Brandon Sheehy","email":"dev@btsheehy.com"},"license":"GPL-3.0-or-later","_id":"@btsheehy/tikka@2.0.0","maintainers":[{"name":"btsheehy","email":"npm@btsheehy.com"}],"homepage":"https://github.com/btsheehy/tikka#readme","bugs":{"url":"https://github.com/btsheehy/tikka/issues"},"dist":{"shasum":"400f1fa92e33f02bdd551ee6e0d9e87b519c13e3","tarball":"https://registry.npmjs.org/@btsheehy/tikka/-/tikka-2.0.0.tgz","fileCount":447,"integrity":"sha512-UCJjeTCog1rgMju+e5kUUPWYynIInA+hvi1WfFQl72EXI2qDDCG9FYnQu1wcF8Fn+fh1KP/gDAuWLMPdjAXKKQ==","signatures":[{"sig":"MEUCIAHvLsGEKsE9j0UCcbzNiyBKrJzoJc9KFY+t6VMNOS1GAiEAnbkuMUksuhO2ut8brcI6QdaZ4aKVEyfecYA1eeu5Ink=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":378379},"main":"dist/index.cjs","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./all":{"types":"./dist/tikka.d.ts","import":"./dist/tikka.js","require":"./dist/tikka.cjs"},"./data-first":{"types":"./dist/data-first.d.ts","import":"./dist/data-first.js","require":"./dist/data-first.cjs"},"./package.json":"./package.json"},"gitHead":"6fccc58a57fa0f966dc7eeb5ba72ec3d8da287c9","scripts":{"lint":"biome check .","perf":"vitest bench test/perf/library-comparison.bench.ts test/perf/short-circuit.bench.ts test/perf/object-and-deep.bench.ts test/perf/pipe.bench.ts","test":"vitest run","build":"npm run clean && rollup -c","check":"npm run lint && npm run typecheck && npm run test && npm run build","clean":"rm -rf dist","format":"biome format . --write && npm run format:md-code-blocks","lint:fix":"biome check . --write","perf:test":"sh -c 'vitest bench test/perf/library-comparison.bench.ts test/perf/short-circuit.bench.ts test/perf/object-and-deep.bench.ts test/perf/pipe.bench.ts --testNamePattern \"$1\"' --","typecheck":"tsc --noEmit","perf:watch":"vitest bench --watch test/perf/library-comparison.bench.ts test/perf/short-circuit.bench.ts test/perf/object-and-deep.bench.ts test/perf/pipe.bench.ts","test:watch":"vitest","format:md-code-blocks":"bun scripts/format-markdown-code-blocks.ts"},"_npmUser":{"name":"btsheehy","email":"npm@btsheehy.com"},"repository":{"url":"git+https://github.com/btsheehy/tikka.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal dependency-free functional programming utilities for TypeScript and JavaScript","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","_hasShrinkwrap":false,"devDependencies":{"ramda":"^0.32.0","tslib":"^2.8.1","lodash":"^4.17.21","rollup":"^4.52.5","vitest":"^3.2.4","typescript":"^5.9.3","@types/node":"^24.6.1","@types/ramda":"^0.31.1","@types/lodash":"^4.17.20","@biomejs/biome":"^2.4.12","@rollup/plugin-typescript":"^12.1.4"},"_npmOperationalInternal":{"tmp":"tmp/tikka_2.0.0_1777323009053_0.030309103921010383","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@btsheehy/tikka","version":"2.1.0","description":"Minimal dependency-free functional programming utilities for TypeScript and JavaScript","sideEffects":false,"main":"dist/index.cjs","module":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./all":{"types":"./dist/tikka.d.ts","import":"./dist/tikka.js","require":"./dist/tikka.cjs"},"./data-first":{"types":"./dist/data-first.d.ts","import":"./dist/data-first.js","require":"./dist/data-first.cjs"},"./package.json":"./package.json"},"scripts":{"clean":"rm -rf dist","build":"npm run clean && rollup -c","lint":"biome check .","lint:fix":"biome check . --write","format:md-code-blocks":"bun scripts/format-markdown-code-blocks.ts","format":"biome format . --write && npm run format:md-code-blocks","typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest","perf":"vitest bench test/perf/library-comparison.bench.ts test/perf/short-circuit.bench.ts test/perf/object-and-deep.bench.ts test/perf/pipe.bench.ts","perf:watch":"vitest bench --watch test/perf/library-comparison.bench.ts test/perf/short-circuit.bench.ts test/perf/object-and-deep.bench.ts test/perf/pipe.bench.ts","perf:test":"sh -c 'vitest bench test/perf/library-comparison.bench.ts test/perf/short-circuit.bench.ts test/perf/object-and-deep.bench.ts test/perf/pipe.bench.ts --testNamePattern \"$1\"' --","check":"npm run lint && npm run typecheck && npm run test && npm run build"},"repository":{"type":"git","url":"git+https://github.com/btsheehy/tikka.git"},"keywords":["functional","programming","utilities","typescript","tree-shaking"],"author":{"name":"Brandon Sheehy","email":"dev@btsheehy.com"},"license":"GPL-3.0-or-later","bugs":{"url":"https://github.com/btsheehy/tikka/issues"},"homepage":"https://github.com/btsheehy/tikka#readme","devDependencies":{"@biomejs/biome":"^2.4.12","@rollup/plugin-typescript":"^12.1.4","@types/lodash":"^4.17.20","@types/node":"^24.6.1","@types/ramda":"^0.31.1","lodash":"^4.17.21","ramda":"^0.32.0","rollup":"^4.52.5","tslib":"^2.8.1","typescript":"^5.9.3","vitest":"^3.2.4"},"_id":"@btsheehy/tikka@2.1.0","gitHead":"8b776d4e8376e248a94d8104cd6e302933100683","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-P9MF0RR51SZXvibe7Z8vy4zPmsBbKkIu2oa/3GlY/uDqgnK5/mWjCGdyw2MpeOLBSOe1nEInXK7+lJGfw9zdOg==","shasum":"3d2b28519aa650d9e21c68877d2be315d3e10254","tarball":"https://registry.npmjs.org/@btsheehy/tikka/-/tikka-2.1.0.tgz","fileCount":489,"unpackedSize":435495,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIA6+QWzSj4GH2ezC896RNWFR6a3j6INhLmwT2oKwBIj7AiBN/uXTAO6Kq1zQY97gHKArbQAOTVDFsA3eauFsOkBe4A=="}]},"_npmUser":{"name":"btsheehy","email":"npm@btsheehy.com"},"directories":{},"maintainers":[{"name":"btsheehy","email":"npm@btsheehy.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/tikka_2.1.0_1777513211155_0.11899116660425979"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-20T20:50:41.765Z","modified":"2026-04-30T01:40:11.773Z","1.0.0-alpha.0":"2026-04-20T20:50:41.973Z","1.0.0":"2026-04-22T20:16:04.519Z","1.0.1":"2026-04-22T20:50:24.095Z","2.0.0":"2026-04-27T20:50:09.301Z","2.1.0":"2026-04-30T01:40:11.336Z"},"bugs":{"url":"https://github.com/btsheehy/tikka/issues"},"author":{"name":"Brandon Sheehy","email":"dev@btsheehy.com"},"license":"GPL-3.0-or-later","homepage":"https://github.com/btsheehy/tikka#readme","keywords":["functional","programming","utilities","typescript","tree-shaking"],"repository":{"type":"git","url":"git+https://github.com/btsheehy/tikka.git"},"description":"Minimal dependency-free functional programming utilities for TypeScript and JavaScript","maintainers":[{"name":"btsheehy","email":"npm@btsheehy.com"}],"readme":"# tikka\n\nTikka is a minimal, dependency-free functional utility library for TypeScript and JavaScript. It works out of the box, is fully typed, tested, and bundled for modern ESM tree-shaking so consumers only pay for what they import.\n\n## Why use tikka\n\n- Minimal API surface focused on practical helpers\n- Zero runtime dependencies\n- TypeScript type declarations published in package output\n- Curried utilities for composable functional style\n- Tested with Vitest\n- Bundled with Rollup and validated for tree-shaking\n\n## Why teams switch from larger FP utility libraries\n\nA common pain point with utility libraries is bundle bloat when a project imports a broad FP API surface.\n\nMeasured with the same browser bundling setup (esbuild, minified, loading each library's full FP API object):\n\n- `tikka/all`: 5.25 KiB minified / 2.29 KiB gzip\n- `lodash/fp`: 82.27 KiB minified / 29.15 KiB gzip\n- `ramda`: 68.04 KiB minified / 20.30 KiB gzip\n\nThat means `tikka/all` is roughly:\n\n- ~15.7x smaller than `lodash/fp` (minified)\n- ~13.0x smaller than `ramda` (minified)\n\nIf you only import specific named utilities from `tikka`, tree-shaking can reduce this even further.\n\n## Installation\n\nnpm install tikka\n\n## Usage\n\nNamed imports (recommended for tree-shaking):\n\n```ts\nimport { filter, isEven, map, pipe, plus } from 'tikka'\n\nconst result = pipe(filter(isEven), map(plus(1)))([1, 2, 3, 4])\n// [3, 5]\n```\n\nDefault aggregate import (all utilities):\n\n```ts\nimport tikka from 'tikka/all'\n\nconst out = tikka.map(tikka.multiply(2), [1, 2, 3]) // [2, 4, 6]\n```\n\nData-first wrappers (underscore-prefixed):\n\n```ts\nimport { _get, _map, _sortBy } from 'tikka/data-first'\n\nconst user = { name: 'Brandon', score: 7 }\nconst name = _get(user, 'name')\nconst doubled = _map([1, 2, 3], (n) => n * 2)\nconst sorted = _sortBy([{ score: 2 }, { score: 1 }], 'score', 'asc')\n```\n\n## Tree-shaking\n\nUse named ESM imports from `tikka`:\n\n```ts\nimport { plus } from 'tikka'\n```\n\nThis package is published with `sideEffects: false` and ESM module output designed for dead-code elimination. Verified with a Rollup consumer bundle: importing only `plus` emits only the `plus` implementation.\n\n## API\n\nNotes:\n- Many helpers are curried (especially those implemented with `curryRight`).\n- Argument order for most collection helpers is callback/key first, then data.\n- Aliases are documented explicitly below.\n\n### and(a, b)\nBoolean AND over two values.\nExample:\n```ts\nand(true, false) // false\n```\n\n### any(test, arr)\nReturns true if at least one array element passes `test`.\nExample:\n```ts\nany((x) => x > 2, [1, 2, 3]) // true\nany(gt(2), [1, 2, 3]) // true\n```\n\n### compact(arr)\nRemoves `null` and `undefined` values from an array.\nExample:\n```ts\ncompact([1, null, 2, undefined]) // [1,2]\n```\n\n### concat(left, right)\nConcatenates arrays or strings.\nExamples:\n```ts\nconcat([1, 2], [3, 4]) // [1,2,3,4]\nconcat('ab', 'cd') // 'abcd'\n```\n\n### contains(value, searchTarget)\nChecks whether `searchTarget.includes(value)` is true.\nExample:\n```ts\ncontains(2, [1, 2, 3]) // true\n```\n\n### countBy(iteratee, arr)\nBuilds a frequency object keyed by `iteratee(value)`.\nExample:\n```ts\ncountBy((x) => (isOdd(x) ? 'odd' : 'even'), [1, 2, 3, 4]) // { odd: 2, even: 2 }\n```\n\n### countWhere(test, arr)\nCounts array elements matching `test`.\nExample:\n```ts\ncountWhere((x) => x % 2 === 0, [1, 2, 3, 4]) // 2\ncountWhere(isEven, [1, 2, 3, 4]) // 2\n```\n\n### curry(fn, arity?)\nLeft-to-right curry helper.\nExample:\n```ts\ncurry((a, b, c) => a + b + c)(1)(2)(3) // 6\n```\n\n### curryRight(fn, arity?)\nRight-to-left curry helper.\nExample:\n```ts\ncurryRight((a, b) => a / b)(2, 8) // 4\n```\n\n### debug(msg, value)\nLogs `msg` and `value`, then returns `value`.\nExample:\n```ts\ndebug('current', 42) // 42\n```\nThis is most useful for debugging a particularly long `pipe` command.\n\n### deepClone(data)\nDeep-clones arrays/objects recursively (supports Date and RegExp cloning).\nExample:\n```ts\ndeepClone({ a: { b: [1] } })\n```\n\n### deepForEach(func, data)\nRecursively visits nested arrays/objects and runs `func` on leaf values.\nExample:\n```ts\ndeepForEach(console.log, { a: [1, { b: 2 }] })\n// 1\n// 2\n```\n\n### deepMap(func, data)\nRecursively maps leaf values in nested arrays/objects.\nExample:\n```ts\ndeepMap((x) => (typeof x === 'number' ? x * 2 : x), { a: [1, 2, 'c'] })\n// { a: [2, 4, 'c'] }\n```\n\n### every(test, arr)\nReturns true if all elements pass `test`.\nExample:\n```ts\nevery((x) => x > 0, [1, 2, 3]) // true\nevery(lt(0))([-4, -5, 2]) // false\n```\n\n### filter(test, arr)\nFilters an array by predicate.\nExample:\n```ts\nfilter((x) => x > 1, [1, 2, 3]) // [ 2,3 ]\nfilter(gt(1), [1, 2, 3]) // [2, 3]\n```\n\n### find(test, arr)\nReturns first matching element or `undefined`.\nExample:\n```ts\nfind((x) => x > 1, [1, 2, 3]) // 2\nfind(gt(1), [1, 2, 3]) // 2\n```\n\n### findIndex(test, arr)\nReturns index of first matching element or `-1`.\nExample:\n```ts\nfindIndex(gt(1), [1, 2, 3]) // 1\n```\n\n### first(arr)\nAlias of `head`.\nExample:\n```ts\nfirst([1, 2, 3]) // 1\n```\n\n### flatten(arr)\nDeep-flattens nested arrays.\nExample:\n```ts\nflatten([1, [2, [3]], 4]) // [1,2,3,4]\n```\n\n### forEach(func, arr)\nRuns `func` for each element and returns original array.\nExample:\n```ts\nforEach(console.log, [1, 2])\n// 1\n// 2\n```\n\n### forEachValues(func, obj)\nRuns `func` for each object value and returns original object.\nExample:\n```ts\nforEachValues(console.log, { a: 1, b: 2 })\n// 1\n// 2\n```\n\n### get(prop, obj)\nGets property by key.\nExample:\n```ts\nget('a', { a: 1 }) // 1\n```\n\n### getOr(defaultValue, prop, obj)\nGets property if present, otherwise returns `defaultValue`.\nExample:\n```ts\ngetOr(0, 'a', {}) // 0\n```\n\n### grab(props, data)\nPicks listed keys from an object, or from each object in an array.\nExample:\n```ts\ngrab(['a'], { a: 1, b: 2 }) // { a: 1 }\ngrab(['a'], [{ a: 1, b: 2 }, { a: 5, c: 9 }]) // [{ a: 1 }, { a: 5 }]\n```\n\n### groupBy(groupingFunction, arr)\nGroups array values by iteratee or string key.\nExample:\n```ts\ngroupBy((x) => isOdd(x) ? 'odd' : 'even', [1, 2, 3]) // { odd: [ 1, 3 ], even: [ 2 ] }\ngroupBy('foo', [{ foo: 1, bar: 300, baz: 'abc'}, { foo: 2, bar: 9, baz: 'def'}, { foo: 2, bar: 1000 }]) \n// {\n//   '1': [ { foo: 1, bar: 300, baz: 'abc' } ],\n//   '2': [ { foo: 2, bar: 9, baz: 'def' }, { foo: 2, bar: 1000 } ]\n// }\n```\n\n### gt(a, b)\nGreater-than comparison.\nExample:\n```ts\ngt(3, 2) // true\n```\n\n### gte(a, b)\nGreater-than-or-equal comparison.\nExample:\n```ts\ngte(3, 3) // true\n```\n\n### has(prop, obj)\nOwn-property existence check.\nExample:\n```ts\nhas('a', { a: 1 }) // true\n```\n\n### head(arr)\nReturns first element.\nExample:\n```ts\nhead([1, 2, 3]) // 1\n```\n\n### highest(nums)\nReturns the largest number in an array.\nExample:\n```ts\nhighest([4, 1, 9, 3]) // 9\n```\n\n### highestBy(fn, arr)\nReturns the element with the highest score from `fn`.\nExample:\n```ts\nhighestBy((user) => user.score, [{ name: 'Ari', score: 12 }, { name: 'Bea', score: 21 }])\n// { name: 'Bea', score: 21 }\n```\n\n### identity(value)\nAlias of `self`; returns input unchanged.\nExample:\n```ts\nidentity('x') // 'x'\n```\n\n### ifElse(onFalse, onTrue, test)\nRuns `test()`, then executes `onTrue()` or `onFalse()`.\nExample:\n```ts\nifElse(\n  () => 0,\n  () => 1,\n  () => true\n) // 1\n```\n\n### includes(value, searchTarget)\nAlias of `contains`.\nExample:\n```ts\nincludes('a', 'cat') // true\n```\n\n### isEven(num)\nReturns true for even numbers.\nExample:\n```ts\nisEven(4) // true\n```\n\n### isOdd(num)\nReturns true for odd numbers.\nExample:\n```ts\nisOdd(3) // true\n```\n\n### last(arrOrString)\nReturns final element/character.\nExample:\n```ts\nlast([1, 2, 3]) // 3\n```\n\n### lowest(nums)\nReturns the smallest number in an array.\nExample:\n```ts\nlowest([4, 1, 9, 3]) // 1\n```\n\n### lowestBy(fn, arr)\nReturns the element with the lowest score from `fn`.\nExample:\n```ts\nlowestBy((user) => user.score, [{ name: 'Ari', score: 12 }, { name: 'Bea', score: 21 }])\n// { name: 'Ari', score: 12 }\n```\n\n### lt(a, b)\nLess-than comparison.\nExample:\n```ts\nlt(2, 3) // true\n```\n\n### lte(a, b)\nLess-than-or-equal comparison.\nExample:\n```ts\nlte(3, 3) // true\n```\n\n### map(fn, arr)\nMaps array values.\nExample:\n```ts\nmap((x) => x * 2, [1, 2, 3]) // [2,4,6]\n```\n\n### mapKeys(fn, obj)\nTransforms object keys, preserving values.\nExample:\n```ts\nmapKeys((k) => k.toUpperCase(), { a: 1 }) // { A: 1 }\n```\n\n### mapValues(fn, obj)\nTransforms object values, preserving keys.\nExample:\n```ts\nmapValues((v) => v * 2, { a: 1 }) // { a: 2 }\n```\n\n### max(a, b)\nReturns the larger of two numbers.\nExample:\n```ts\nmax(4, 9) // 9\n```\n\n### min(a, b)\nReturns the smaller of two numbers.\nExample:\n```ts\nmin(4, 9) // 4\n```\n\n### minus(b, a)\nSubtracts second arg from first in curried-right style.\nExample:\n```ts\nminus(3, 10) // 7\n```\n\n### noop()\nNo-op function.\nExample:\n```ts\nnoop() // undefined\n```\n\n### or(a, b)\nBoolean OR over two values.\nExample:\n```ts\nor(false, true) // true\n```\n\n### pipe(...fns)\nCreates a left-to-right function pipeline. This is the core composition primitive in tikka.\n\nExample:\n```ts\nimport { pipe } from 'tikka'\n\nconst transform = pipe(\n  (value: number) => value + 1,\n  (value) => value * 2\n)\n\ntransform(2)\n// 6\n```\n\nCommon tikka composition pattern:\n```ts\nimport { filter, isEven, map, pipe, plus, take } from 'tikka'\n\nconst firstThreeIncrementedEvens = pipe(filter(isEven), map(plus(1)), take(3))\n\nfirstThreeIncrementedEvens([1, 2, 3, 4, 5, 6, 7, 8])\n// [3, 5, 7]\n```\n\nPipeline with object helpers:\n```ts\nimport { grab, map, pipe, sortBy } from '@btsheehy/tikka'\n\nconst selectLeaderboardFields = pipe(sortBy('score', 'desc'), map(grab(['name', 'score'])))\n\nselectLeaderboardFields([\n  { name: 'Ari', score: 12, email: 'ari@example.com' },\n  { name: 'Bea', score: 19, email: 'bea@example.com' },\n])\n// [{ name: 'Bea', score: 19 }, { name: 'Ari', score: 12 }]\n```\n\n### pluck(prop, collection)\nExtracts property values from array of objects.\nExample:\n```ts\npluck('name', [{ name: 'a' }, { name: 'b' }]) // ['a','b']\n```\n\n### plus(a, b)\nAdds two numbers.\nExample:\n```ts\nplus(2, 3) // 5\n```\n\n### remove(pred, arr)\nReturns a new array with items removed when `pred(item)` is `true`.\nExample:\n```ts\nremove((n) => n % 2 === 0, [1, 2, 3, 4]) // [1, 3]\n```\n\n### select(props, data)\nAlias of `grab`.\nExample:\n```ts\nselect(['id'], { id: 1, name: 'x' }) // { id:1 }\n```\n\n### self(value)\nReturns input unchanged.\nExample:\n```ts\nself(42) // 42\n```\n\n### sort(iteratee, arr)\nSorts an array by a computed key (non-mutating).\nExample:\n```ts\nsort((x) => x.age, [{ age: 3 }, { age: 1 }]) // [{age:1},{age:3}]\n```\n\n### sortBy(fieldOrIteratee, direction, arr)\nSorts an array of objects by either a field name or a value-selector function, using `'asc'` or `'desc'` direction.\nExamples:\n```ts\nsortBy('age', 'desc', [{ age: 1 }, { age: 3 }, { age: 2 }]) // [{age:3},{age:2},{age:1}]\nsortBy((x) => x.age, 'asc', [{ age: 3 }, { age: 1 }]) // [{age:1},{age:3}]\n```\n\n### tail(arrOrString)\nReturns everything except the first element/character.\nExamples:\n```ts\ntail([1, 2, 3]) // [2,3]\ntail('hello') // 'ello'\n```\n\n### take(num, arr)\nReturns first `num` elements.\nExample:\n```ts\ntake(2, [1, 2, 3]) // [1,2]\n```\n\n### test(regex, str)\nRuns `regex.test(str)`.\nExample:\n```ts\ntest(/ab/, 'zabx') // true\n```\n\n### toLower(str)\nLowercases string with locale support.\nExample:\n```ts\ntoLower('AbC') // 'abc'\n```\n\n### toUpper(str)\nUppercases string with locale support.\nExample:\n```ts\ntoUpper('AbC') // 'ABC'\n```\n\n### trim(str)\nTrims string whitespace.\nExample:\n```ts\ntrim('  x  ') // 'x'\n```\n\n### type(val)\nReturns internal type label (for example: `Array`, `Object`, `Null`, `Undefined`).\nExample:\n```ts\ntype([]) // 'Array'\n```\n\n### uniq(arr)\nReturns array with duplicate values removed (first occurrence kept).\nExample:\n```ts\nuniq([1, 2, 1, 3]) // [1,2,3]\n```\n\n### uniqBy(uniqCond, arr)\nReturns unique items by computed key.\nExample:\n```ts\nuniqBy(get('id'), [{ id: 1 }, { id: 1 }, { id: 2 }])\n```\n\n## Performance benchmark suites (large datasets)\n\nThis repo includes dedicated performance benchmark suites to compare identical function workloads across `tikka`, `lodash/fp`, and `ramda` on very large deterministic datasets.\n\nBenchmarked functions:\n- `map`\n- `filter`\n- `find`\n- `groupBy`\n- `uniq`\n- `uniqBy`\n- `flatten` / `flattenDeep`\n- `contains` / `includes`\n- Composed `pipe` collection pipeline (`filter -> map -> uniq -> find`)\n\nDataset sizes (generated in `test/perf/fixtures.ts`):\n- `numbers`: 60,000 items\n- `users`: 80,000 objects\n- `nestedNumbers`: 5,000 nested groups\n\nCommands:\n- Parity validation (same output across all three libs): `vitest run test/perf/parity.test.ts`\n- Performance suite: `npm run perf`\n- Watch performance suite: `npm run perf:watch`\n- Run a specific benchmark group by test name pattern: `npm run perf:test -- map`\n- Run the composed pipeline benchmark group: `npm run perf:test -- \"pipe collection pipeline\"`\n\n## Quality gates in this repo\n\n- Lint: `npm run lint`\n- Type-check: `npm run typecheck`\n- Tests: `npm test`\n- Build: `npm run build`\n- Full check: `npm run check`\n\n## Biome rule policy\n\nThis codebase intentionally allows dynamic typing patterns used by curried functional helpers:\n- `suspicious.noExplicitAny`: off\n- `complexity.noBannedTypes`: off\n\nThose two rules were disabled to avoid unsafe blanket suppressions in many files while preserving the rest of Biome recommended rules.\n","readmeFilename":"README.md"}