Higher-Order TypeScript (HOTScript)
A library of composable functions for the type level!
Transform your TypeScript types in any way you want using functions you already know.
Features
- Type-level higher-order functions (
Tuples.Map
,Tuples.Filter
,Objects.MapValues
, etc). - Type-level pattern matching with
Match
. - Performant math operations (
Numbers.Add
,Numbers.Sub
,Numbers.Mul
,Numbers.Div
, etc). - Custom "lambda" functions.
🚧 work in progress 🚧
Installation
You can find HotScript on npm:
npm install -D hotscript
HotScript is a work-in-progress library, so expect breaking changes in its API.
Examples
Transforming a list
Run this as a TypeScript Playground
import { Pipe, Tuples, Strings, Numbers } from "hotscript";
type res1 = Pipe<
// ^? 62
[1, 2, 3, 4],
[
Tuples.Map<Numbers.Add<3>>, // [4, 5, 6, 7]
Tuples.Join<".">, // "4.5.6.7"
Strings.Split<".">, // ["4", "5", "6", "7"]
Tuples.Map<Strings.Prepend<"1">>, // ["14", "15", "16", "17"]
Tuples.Map<Strings.ToNumber>, // [14, 15, 16, 17]
Tuples.Sum // 62
]
>;
Defining a first-class function
Run this as a TypeScript Playground
import { Call, Fn, Tuples } from "hotscript";
// This is a type-level "lambda"!
interface Duplicate extends Fn {
return: [this["arg0"], this["arg0"]];
}
type result1 = Call<Tuples.Map<Duplicate>, [1, 2, 3, 4]>;
// ^? [[1, 1], [2, 2], [3, 3], [4, 4]]
type result2 = Call<Tuples.FlatMap<Duplicate>, [1, 2, 3, 4]>;
// ^? [1, 1, 2, 2, 3, 3, 4, 4]
Transforming an object type
Run this as a TypeScript Playground
import { Pipe, Objects, Booleans } from "hotscript";
// Let's compose some functions to transform an object type:
type ToAPIPayload<T> = Pipe<
T,
[
Objects.OmitBy<Booleans.Equals<symbol>>,
Objects.Assign<{ metadata: { newUser: true } }>,
Objects.SnakeCaseDeep,
Objects.Assign<{ id: string }>
]
>;
type T = ToAPIPayload<{
id: symbol;
firstName: string;
lastName: string;
}>;
// Returns:
type T = {
id: string;
metadata: { new_user: true };
first_name: string;
last_name: string;
};
Parsing a route path
Run this as a TypeScript Playground
https://user-images.githubusercontent.com/2315749/222081717-96217cd2-ac89-4e06-a942-17fbda717cd2.mp4
import { Pipe, Objects, Strings, ComposeLeft, Tuples, Match } from "hotscript";
type res5 = Pipe<
// ^? { id: string, index: number }
"/users/<id:string>/posts/<index:number>",
[
Strings.Split<"/">,
Tuples.Filter<Strings.StartsWith<"<">>,
Tuples.Map<ComposeLeft<[Strings.Trim<"<" | ">">, Strings.Split<":">]>>,
Tuples.ToUnion,
Objects.FromEntries,
Objects.MapValues<
Match<[Match.With<"string", string>, Match.With<"number", number>]>
>
]
>;
API
- <input checked="" disabled="" type="checkbox"> Core
- <input checked="" disabled="" type="checkbox">
Pipe<Input, Fn[]>
- <input checked="" disabled="" type="checkbox">
PipeRight<Fn[], Input>
- <input checked="" disabled="" type="checkbox">
Call<Fn, ...Arg>
- <input checked="" disabled="" type="checkbox">
Apply<Fn, Arg[]>
- <input checked="" disabled="" type="checkbox">
PartialApply<Fn, Arg[]>
- <input checked="" disabled="" type="checkbox">
Compose<Fn[]>
- <input checked="" disabled="" type="checkbox">
ComposeLeft<Fn[]>
- <input checked="" disabled="" type="checkbox">
- <input checked="" disabled="" type="checkbox"> Function
- <input checked="" disabled="" type="checkbox">
ReturnType<Fn>
- <input checked="" disabled="" type="checkbox">
Parameters<Fn>
- <input checked="" disabled="" type="checkbox">
Parameter<N, Fn>
- <input checked="" disabled="" type="checkbox">
MapReturnType<Fn, FunctionType>
- <input checked="" disabled="" type="checkbox">
MapParameters<Fn, FunctionType>
- <input checked="" disabled="" type="checkbox">
- <input disabled="" type="checkbox"> Tuples
- <input checked="" disabled="" type="checkbox">
Create<X> -> [X]
- <input checked="" disabled="" type="checkbox">
Partition<Tuple>
- <input checked="" disabled="" type="checkbox">
IsEmpty<Tuple>
- <input checked="" disabled="" type="checkbox">
Zip<...Tuple[]>
- <input checked="" disabled="" type="checkbox">
ZipWith<Fn, ...Tuple[]>
- <input checked="" disabled="" type="checkbox">
Sort<Tuple>
- <input checked="" disabled="" type="checkbox">
Head<Tuple>
- <input checked="" disabled="" type="checkbox">
Tail<Tuple>
- <input checked="" disabled="" type="checkbox">
At<N, Tuple>
- <input checked="" disabled="" type="checkbox">
Last<Tuple>
- <input checked="" disabled="" type="checkbox">
FlatMap<Fn, Tuple>
- <input checked="" disabled="" type="checkbox">
Find<Fn, Tuple>
- <input checked="" disabled="" type="checkbox">
Drop<N, Tuple>
- <input checked="" disabled="" type="checkbox">
Take<N, Tuple>
- <input checked="" disabled="" type="checkbox">
TakeWhile<Fn, Tuple>
- <input checked="" disabled="" type="checkbox">
GroupBy<Fn, Tuple>
- <input checked="" disabled="" type="checkbox">
Join<Str, Tuple>
- <input checked="" disabled="" type="checkbox">
Map<Fn, Tuple>
- <input checked="" disabled="" type="checkbox">
Filter<Fn, Tuple>
- <input checked="" disabled="" type="checkbox">
Reduce<Fn, Init, Tuple>
- <input checked="" disabled="" type="checkbox">
ReduceRight<Fn, Init, Tuple>
- <input checked="" disabled="" type="checkbox">
Reverse<Tuple>
- <input checked="" disabled="" type="checkbox">
Every<Fn, Tuple>
- <input checked="" disabled="" type="checkbox">
Some<Fn, Tuple>
- <input checked="" disabled="" type="checkbox">
SplitAt<N, Tuple>
- <input checked="" disabled="" type="checkbox">
ToUnion<Tuple>
- <input checked="" disabled="" type="checkbox">
ToIntersection<Tuple>
- <input checked="" disabled="" type="checkbox">
Prepend<X, Tuple>
- <input checked="" disabled="" type="checkbox">
Append<X, Tuple>
- <input checked="" disabled="" type="checkbox">
Concat<T1, T2>
- <input checked="" disabled="" type="checkbox">
Min<Tuple>
- <input checked="" disabled="" type="checkbox">
Max<Tuple>
- <input checked="" disabled="" type="checkbox">
Sum<Tuple>
- <input checked="" disabled="" type="checkbox">
- <input disabled="" type="checkbox"> Object
- <input checked="" disabled="" type="checkbox">
Readonly<Obj>
- <input checked="" disabled="" type="checkbox">
Mutable<Obj>
- <input checked="" disabled="" type="checkbox">
Required<Obj>
- <input checked="" disabled="" type="checkbox">
Partial<Obj>
- <input checked="" disabled="" type="checkbox">
ReadonlyDeep<Obj>
- <input checked="" disabled="" type="checkbox">
MutableDeep<Obj>
- <input checked="" disabled="" type="checkbox">
RequiredDeep<Obj>
- <input checked="" disabled="" type="checkbox">
PartialDeep<Obj>
- <input checked="" disabled="" type="checkbox">
Update<Path, Fn | V, Obj>
- <input checked="" disabled="" type="checkbox">
Record<Key, Value>
- <input checked="" disabled="" type="checkbox">
Keys<Obj>
- <input checked="" disabled="" type="checkbox">
Values<Obj>
- <input checked="" disabled="" type="checkbox">
AllPaths<Obj>
- <input checked="" disabled="" type="checkbox">
Create<Pattern, X>
- <input checked="" disabled="" type="checkbox">
Get<Path, Obj>
- <input checked="" disabled="" type="checkbox">
FromEntries<[Key, Value]>
- <input checked="" disabled="" type="checkbox">
Entries<Obj>
- <input checked="" disabled="" type="checkbox">
MapValues<Fn, Obj>
- <input checked="" disabled="" type="checkbox">
MapKeys<Fn, Obj>
- <input checked="" disabled="" type="checkbox">
Assign<...Obj>
- <input checked="" disabled="" type="checkbox">
Pick<Key, Obj>
- <input checked="" disabled="" type="checkbox">
PickBy<Fn, Obj>
- <input checked="" disabled="" type="checkbox">
Omit<Key, Obj>
- <input checked="" disabled="" type="checkbox">
OmitBy<Fn, Obj>
- <input checked="" disabled="" type="checkbox">
CamelCase<Obj>
- <input checked="" disabled="" type="checkbox">
CamelCaseDeep<Obj>
- <input checked="" disabled="" type="checkbox">
SnakeCase<Obj>
- <input checked="" disabled="" type="checkbox">
SnakeCaseDeep<Obj>
- <input checked="" disabled="" type="checkbox">
KebabCase<Obj>
- <input checked="" disabled="" type="checkbox">
KebabCaseDeep<Obj>
- <input checked="" disabled="" type="checkbox">
- <input disabled="" type="checkbox"> Union
- <input checked="" disabled="" type="checkbox">
Map<Fn, U>
- <input checked="" disabled="" type="checkbox">
Extract<T, U>
- <input checked="" disabled="" type="checkbox">
ExtractBy<Fn, U>
- <input checked="" disabled="" type="checkbox">
Exclude<T, U>
- <input checked="" disabled="" type="checkbox">
ExcludeBy<Fn, U>
- <input checked="" disabled="" type="checkbox">
NonNullable<U>
- <input checked="" disabled="" type="checkbox">
ToTuple<U>
- <input checked="" disabled="" type="checkbox">
ToIntersection<U>
- <input checked="" disabled="" type="checkbox">
- <input disabled="" type="checkbox"> String
- <input checked="" disabled="" type="checkbox">
Length<Str>
- <input checked="" disabled="" type="checkbox">
TrimLeft<Str>
- <input checked="" disabled="" type="checkbox">
TrimRight<Str>
- <input checked="" disabled="" type="checkbox">
Trim<Str>
- <input checked="" disabled="" type="checkbox">
Join<Sep, Str>
- <input checked="" disabled="" type="checkbox">
Replace<From, To, Str>
- <input checked="" disabled="" type="checkbox">
Slice<Start, End, Str>
- <input checked="" disabled="" type="checkbox">
Split<Sep, Str>
- <input checked="" disabled="" type="checkbox">
Repeat<N, Str>
- <input checked="" disabled="" type="checkbox">
StartsWith<S, Str>
- <input checked="" disabled="" type="checkbox">
EndsWith<E, Str>
- <input checked="" disabled="" type="checkbox">
ToTuple<Str>
- <input checked="" disabled="" type="checkbox">
ToNumber<Str>
- <input checked="" disabled="" type="checkbox">
ToString<Str>
- <input checked="" disabled="" type="checkbox">
Prepend<Start, Str>
- <input checked="" disabled="" type="checkbox">
Append<End, Str>
- <input checked="" disabled="" type="checkbox">
Uppercase<Str>
- <input checked="" disabled="" type="checkbox">
Lowercase<Str>
- <input checked="" disabled="" type="checkbox">
Capitalize<Str>
- <input checked="" disabled="" type="checkbox">
Uncapitalize<Str>
- <input checked="" disabled="" type="checkbox">
SnakeCase<Str>
- <input checked="" disabled="" type="checkbox">
CamelCase<Str>
- <input checked="" disabled="" type="checkbox">
KebabCase<Str>
- <input checked="" disabled="" type="checkbox">
Compare<Str, Str>
- <input checked="" disabled="" type="checkbox">
Equal<Str, Str>
- <input checked="" disabled="" type="checkbox">
NotEqual<Str, Str>
- <input checked="" disabled="" type="checkbox">
LessThan<Str, Str>
- <input checked="" disabled="" type="checkbox">
LessThanOrEqual<Str, Str>
- <input checked="" disabled="" type="checkbox">
GreaterThan<Str, Str>
- <input checked="" disabled="" type="checkbox">
GreaterThanOrEqual<Str, Str>
- <input checked="" disabled="" type="checkbox">
- <input disabled="" type="checkbox"> Number
- <input checked="" disabled="" type="checkbox">
Add<N, M>
- <input checked="" disabled="" type="checkbox">
Multiply<N, M>
- <input checked="" disabled="" type="checkbox">
Subtract<N, M>
- <input checked="" disabled="" type="checkbox">
Negate<N>
- <input checked="" disabled="" type="checkbox">
Power<N, M>
- <input checked="" disabled="" type="checkbox">
Div<N, M>
- <input checked="" disabled="" type="checkbox">
Mod<N, M>
- <input checked="" disabled="" type="checkbox">
Abs<N>
- <input checked="" disabled="" type="checkbox">
Compare<N, M>
- <input checked="" disabled="" type="checkbox">
GreaterThan<N, M>
- <input checked="" disabled="" type="checkbox">
GreaterThanOrEqual<N, M>
- <input checked="" disabled="" type="checkbox">
LessThan<N, M>
- <input checked="" disabled="" type="checkbox">
LessThanOrEqual<N, M>
- <input checked="" disabled="" type="checkbox">
- <input disabled="" type="checkbox"> Boolean
- <input checked="" disabled="" type="checkbox">
And<Bool, Bool>
- <input checked="" disabled="" type="checkbox">
Or<Bool, Bool>
- <input checked="" disabled="" type="checkbox">
XOr<Bool, Bool>
- <input checked="" disabled="" type="checkbox">
Not<Bool>
- <input checked="" disabled="" type="checkbox">
Extends<A, B>
- <input checked="" disabled="" type="checkbox">
Equals<A, B>
- <input checked="" disabled="" type="checkbox">
DoesNotExtend<A, B>
- <input checked="" disabled="" type="checkbox">