A flexible inline switch statement with pattern matching for TypeScript/JavaScript.
npm install inlineswitch
- Match against exact values, arrays of values, or predicate functions
- Type-safe with full TypeScript support
- More concise and readable than long if-else chains
- Supports default handlers for non-matching cases
- Checks for duplicate case values
- Tiny library with zero dependencies
import { inlineSwitch } from "inlineswitch";
const result = inlineSwitch(
value,
[
[5, (v) => `Exact match: ${v}`],
[[1, 2, 3], (v) => `Array match: ${v}`],
[(v) => v > 10, (v) => `Predicate match: ${v}`],
],
(v) => `Default: ${v}` // Optional default handler
);
// Exact value matching
const dayName = inlineSwitch(
dayNumber,
[
[0, () => "Sunday"],
[1, () => "Monday"],
[2, () => "Tuesday"],
[3, () => "Wednesday"],
[4, () => "Thursday"],
[5, () => "Friday"],
[6, () => "Saturday"],
],
() => "Invalid day"
);
// Array matching
const fruitCategory = inlineSwitch(
fruit,
[
[["apple", "pear"], () => "pome"],
[["peach", "plum", "cherry"], () => "drupe"],
[["grape", "blueberry"], () => "berry"],
],
() => "other"
);
// Predicate function matching
const sizeCategory = inlineSwitch(length, [
[(v) => v < 10, () => "small"],
[(v) => v >= 10 && v < 100, () => "medium"],
[(v) => v >= 100, () => "large"],
]);
import { switchValue } from "inlineswitch";
// Simpler syntax for value-only checks
const result = switchValue(
color,
["red", () => "#FF0000"],
["green", () => "#00FF00"],
["blue", () => "#0000FF"]
);
inlineSwitch<T, R>(value: T, cases: SwitchCase<T, R>[], defaultHandler?: CaseHandler<T, R>): R | undefined
The main function that implements pattern matching.
-
value
: The value to match against case patterns -
cases
: An array of case patterns and their handlers -
defaultHandler
: Optional default handler if no cases match - Returns the result of the matched handler or the default handler, or undefined
A shorthand version for simple value-only checks.
type CasePattern<T> = T | T[] | ((value: T) => boolean);
type CaseHandler<T, R> = (value: T) => R;
type SwitchCase<T, R> = [CasePattern<T>, CaseHandler<T, R>];
The library throws a DuplicateCaseError
when duplicate case values are detected.
MIT