Skip to content

Instantly share code, notes, and snippets.

View gcanti's full-sized avatar

Giulio Canti gcanti

View GitHub Profile
@gcanti
gcanti / fp-ts-technical-overview.md
Last active March 11, 2024 02:40
fp-ts technical overview

Technical overview

A basic Option type

// Option.ts

// definition
export class None {
  readonly tag: 'None' = 'None'
@gcanti
gcanti / default-props-hoc.ts
Last active March 7, 2017 15:01
A hacky implementation of a default prop hoc
import * as React from 'react'
type Witness<A, B, C> = (x: A & B) => C
// P = original props
// D = defaulted props
// U = untouched props
function removeProps<P, D extends keyof P, U extends keyof P>(defaults: Pick<P, D>, witness: Witness<Pick<P, D>, Pick<P, U>, P>): (Component: React.ComponentClass<P>) => React.ComponentClass<Pick<P, U>> {
return Component => class extends React.Component<Pick<P, U>, void> {
render() {
@gcanti
gcanti / typed-styles.js
Created December 6, 2016 11:31
Typed style POC
// @flow
//
// library agnostic types and helpers
//
// keep private
class Unit<A> {}
class IsMedia {}
@gcanti
gcanti / type_safe_functional_router.md
Created November 8, 2016 11:21
Type safe functional router with Flow
// @flow

// Params -> Querystring -> A
type Handler<A, P = void, Q = void> = (p: P, q: Q) => A;

type Id = { id: string };

// config type
type Router<a> = {</a>
@gcanti
gcanti / type_safe_event_emitter.md
Created November 5, 2016 08:38
Type safe event emitter with Flow
// A is a phantom type that ties an event instance...
class Event<A> {}
// ...to its handler
type Handler<A> = (a: A, ...rest: Array<void>) => void;

declare class EventEmitter {
  on<A, F: Handler<A>>(event: Event<A>, handler: F): void;
  emit<A>(event: Event<A>, a: A): void;
}
@gcanti
gcanti / flow_tlp1.md
Last active April 6, 2018 19:34
Type level programming with Flow, encoding a finite state machine
// @flow

// based on State Machines All The Way Down
// An Architecture for Dependently Typed Applications
// https://eb.host.cs.st-andrews.ac.uk/drafts/states-all-the-way.pdf
// by Edwin Brady

//
// finite state machine
// @flow
declare type Reducer<S, A> = (state: S, action: A) => S;
type ExtractState = <S>(r: Reducer<S, *>) => S;
declare function combineReducers<O, A>(reducers: O): Reducer<$ObjMap<O, ExtractState>, A>;
type State = {
name: string,
age: number
};
@gcanti
gcanti / TDD.md
Last active October 10, 2016 09:51

Type driven development with Flow

Written by @alpacaaa and @GiulioCanti

"Type driven development" is a technique used to split a problem into a set of smaller problems, letting the type checker suggest the concrete implementation, or at least helping us getting there. Here's a practical example

The Problem

Say for instance that we like to reimplement the function Promise.all, we'll name it sequence. Let's start with its signature

@gcanti
gcanti / HOC.js
Created September 14, 2016 09:24
/* @flow */
import React from 'react'
import ReactDOM from 'react-dom'
type FunctionComponent<A> = (props: A) => ?React$Element<any>;
type ClassComponent<D, A, S> = Class<React$Component<D, A, S>>;
type Component<A> = FunctionComponent<A> | ClassComponent<any, A, any>;
@gcanti
gcanti / HKT.js
Last active September 6, 2016 12:01
// @flow
import { HKT } from '../HKT'
import type { Functor } from '../Functor'
class IsList {}
class Cons<A> {
head: A;
tail: ListV<A>;