Skip to content

Instantly share code, notes, and snippets.

View gvergnaud's full-sized avatar
🚀

Gabriel Vergnaud gvergnaud

🚀
View GitHub Profile
import { arg0, Call, Constant, Eval, Fn, Objects, Tuples } from "../src/index";
type Ok<A> = { tag: "Ok"; value: A };
type Err<B> = { tag: "Err"; value: B };
type Result<A, B> = Ok<A> | Err<B>;
type ParseError<expected = unknown, encountered = unknown> = {
expected: expected;
type MergeParameters3<T extends readonly UnknownFunction[]> = H.Pipe<
T,
[
H.Let<"parametersList", H.Tuples.Map<H.Functions.Parameters>>,
H.Let<
"longestLength",
H.ComposeLeft<
[
H.Get<"parametersList">,
H.Tuples.Map<H.Tuples.Length>,
// a conditional type is just type-level code branching
// A extends B means "A is assignable to B"
type Test1 = "hello" extends string ? true : false;
// ^?
type Test2 = 2 extends string ? true : false;
// ^?
import type { Equal, Expect } from '@type-challenges/utils'
type Assign<A, B> = {
[K in keyof A | keyof B]: K extends keyof B
? B[K]
: K extends keyof A
? A[K]
: never;
}
type Range<n, range extends any[] = []> =
range['length'] extends n ? range : Range<n, [...range, range['length']]>
type Drop1<a extends any[]> =
a extends [...infer inits, any] ? inits : []
type Concat<a extends any[], b extends any[]> = [...a, ...b]
type Plus<a, b> =
[...Range<a>, ...Range<b>]['length']
@gvergnaud
gvergnaud / mapped-types-as-recursive-distributive-union-type.ts
Created January 8, 2023 18:27
Can you express any mapped types in terms of recursive + distributive union type?
// mapped type version
type Fn<T> = {
[K in keyof T]: [K, T[K]] /* arbitrary fn using K and T[k] */;
};
// distributive union version
type Fn2<T> = FromEntries<
keyof T extends infer K
? K extends keyof T
? [K, [K, T[K]] /* arbitrary fn using K and T[k] */]
@gvergnaud
gvergnaud / Observable.ts
Last active September 9, 2022 23:04
Test implementation of the Observable spec.
export type Option<T> =
| { readonly type: 'some'; readonly value: T }
| { readonly type: 'none' };
export const none: Option<never> = { type: 'none' };
export const some = <T>(value: T): Option<T> => ({ type: 'some', value });
const compose =
@gvergnaud
gvergnaud / typescript-type-variance.ts
Last active August 30, 2022 15:52
TypeScript type variance (covariance, contravariance and invariance)
/**
* We call "variance" the direction of assignability between two types
* (in other words, which type is a subtype of the other).
*
* The same type can have a different variance in function of his position
* in a larger type, and this is what makes assignability in TypeScript
* not always straightforwards.
*
* There are 4 kinds of variance:
* - Covariant: if the type `a` is assignable to `a | b`.
type TupleToList<xs> = xs extends [infer head, ...(infer tail)]
? [head extends any[] ? head[number] : never, ...TupleToList<tail>]
: [];
function permute<xs extends [] | [any[], ...any[][]]>([
head,
...rest
]: xs): TupleToList<xs>[];
const fs = require("fs");
const tasks = JSON.parse(fs.readFileSync("./input-5req-2render-slow.json"));
// Build histogram of tasks with buckets of 1000ms
const histogram = tasks.reduce((acc, task) => {
const key = Math.floor(task.start / 1000) + "";
return Object.assign(acc, {
[key]: (acc[key] ?? []).concat(task),
});