Packages@accelint/core
Overview
@accelint/core provides a collection of pure, curried utility functions following functional programming principles. All functions are tree-shakeable and designed for composition.
Installation
pnpm add @accelint/coreMain Export
import { map, filter, pipe } from '@accelint/core';
// Or import from subpaths for better tree-shaking
import { map } from '@accelint/core/array/map';
import { pipe } from '@accelint/core/composition/pipe';Categories
Array Functions
Curried array manipulation functions that never mutate the original array:
- map - Transform array elements
- filter - Filter elements by predicate
- reduce - Reduce array to single value
- find - Find first matching element
- every - Test if all elements pass
- some - Test if any element passes
- concat - Concatenate arrays
findIndex,findLast,findLastIndex,includes,indexOf,push,reduceRight,reverse,shift,slice,unshift
Composition Functions
Function composition and currying utilities:
- pipe - Compose functions left-to-right
- compose - Compose functions right-to-left
- autoCurry - Transform function to accept partial application
Combinators
Fundamental functional programming primitives:
identity- Returns input unchangedconstant- Returns constant value ignoring inputapply- Apply function to argumentsapplyTo- Apply value to functionfork- Apply multiple functions to same inputcomposition- Compose two functionsinverseConstant- Returns input ignoring constant
Logical Operators
Functional alternatives to logical operators:
and,or,not,xor- Boolean logic operationsnand,nor- Negated logic operationsequality- Curried equality comparisonnullishOr- Nullish coalescing operator
SafeEnum
Type-safe enum pattern avoiding TypeScript enum pitfalls:
- SafeEnum - Type for creating safe enums
- getSafeEnumValues - Extract enum values as array
IsLiteralEnum- Type guard for literal enumsValidEnumStructures- Base constraint for enums
Object Manipulation
Immutable object transformation utilities:
lens- Functional lens for deep property accessget,set- Get/set values using lensesprop,property- Property accessor functionsassoc,associate- Associate values with keyscomposeLens,lensProp,lensOptionalProp- Lens composition
Iterables
Functional approaches to iteration:
createIterable- Create custom iterablesrange- Generate number ranges
Utility Functions
General-purpose utilities:
lookup- Safe property lookupnoop- No-operation functiononce- Execute function only oncetap- Tap into pipeline for side effectsuuid- Generate UUIDsisUUID- Validate UUID format
Design Principles
Currying
All functions are curried for easy partial application and composition:
import { map, filter, pipe } from '@accelint/core';
// Partial application
const double = map((x: number) => x * 2);
double([1, 2, 3]); // [2, 4, 6]
// Composition
const processNumbers = pipe(
filter((x: number) => x > 0),
map((x: number) => x * 2)
);
processNumbers([-1, 0, 1, 2]); // [2, 4]Purity
All functions are pure with no side effects:
import { map } from '@accelint/core';
const original = [1, 2, 3];
const doubled = map((x: number) => x * 2)(original);
console.log(original); // [1, 2, 3] - unchanged
console.log(doubled); // [2, 4, 6] - new arrayType Safety
Full TypeScript support with precise type inference:
import { pipe } from '@accelint/core/composition/pipe';
// Types flow through the pipeline
const transform = pipe(
(x: number) => x * 2, // number => number
(x: number) => x.toString(), // number => string
(x: string) => x.length // string => number
);
const result: number = transform(5); // Type: numberExamples
Example: Data transformation pipeline
import { pipe } from '@accelint/core/composition/pipe';
import { filter } from '@accelint/core/array/filter';
import { map } from '@accelint/core/array/map';
import { reduce } from '@accelint/core/array/reduce';
interface Product {
name: string;
price: number;
inStock: boolean;
}
const products: Product[] = [
{ name: 'Widget', price: 10, inStock: true },
{ name: 'Gadget', price: 20, inStock: false },
{ name: 'Doohickey', price: 15, inStock: true }
];
const totalInStockValue = pipe(
filter((p: Product) => p.inStock),
map((p: Product) => p.price),
reduce((sum: number, price: number) => sum + price)(0)
);
totalInStockValue(products); // 25Example: Safe enum usage
import type { SafeEnum } from '@accelint/core/safe-enum/safe-enum';
import { getSafeEnumValues } from '@accelint/core/safe-enum/get-safe-enum-values';
export const UserRole = Object.freeze({
Admin: 'admin',
Editor: 'editor',
Viewer: 'viewer',
} as const);
export type UserRole = SafeEnum<typeof UserRole>;
function hasPermission(role: UserRole, action: string): boolean {
if (role === UserRole.Admin) return true;
if (role === UserRole.Editor && action === 'edit') return true;
return false;
}
// Validate user input
const validRoles = getSafeEnumValues(UserRole);
function isValidRole(input: string): input is UserRole {
return validRoles.includes(input as UserRole);
}Example: Function composition
import { pipe } from '@accelint/core/composition/pipe';
import { autoCurry } from '@accelint/core/composition/curry';
// Build a flexible greeting function
const greet = autoCurry(
(greeting: string, name: string, punctuation: string) =>
`${greeting}, ${name}${punctuation}`
);
const hello = greet('Hello');
const helloWorld = hello('World');
helloWorld('!'); // "Hello, World!"
helloWorld('?'); // "Hello, World?"Related Packages
@accelint/converters- Type conversion utilities@accelint/math- Mathematical operations@accelint/temporal- Time and date utilities@accelint/bus- Event bus system
License
Apache-2.0