Skip to content

Instantly share code, notes, and snippets.

View cristianoc's full-sized avatar

Cristiano Calcagno cristianoc

View GitHub Profile
module type SlotsType = {
type t('slot, 'nextSlots);
let create: unit => t('slot, 'nextSlots);
let use:
(~default: 'slot, t('slot, t('slot2, 'nextSlots))) =>
('slot, t('slot2, 'nextSlots));
};
module Slots: SlotsType = {
type t('slot, 'nextSlots) = ref(option(('slot, 'nextSlots)));
module type SlotsType = {
type t('slot, 'nextSlots);
let create: unit => t('slot, 'nextSlots);
let use:
(
~default: 'slot,
('slot, t('slot2, 'nextSlots)) => 'c,
t('slot, t('slot2, 'nextSlots))
) =>
'c;
module State: {
type t('a);
let createSlot: (t('a) => 'b) => 'b;
let useHook: ('a, t('a)) => ('a, 'a => unit);
} = {
type t('a) = ref(option('a));
let createSlot = cont => cont(ref(None));
let useHook = (initial: 'a, slot: t('a)) => {
let state =
switch (slot^) {
module HookTypes = {
type state('a);
type effect;
type t('t);
let addState: (t('t), ~state: 'state) => t(('t, state('state))) =
(x, ~state as _) => Obj.magic(x);
let addEffect: t('t) => t(('t, effect)) = Obj.magic;
};
@cristianoc
cristianoc / Hooks.re
Created October 28, 2018 04:58
Essence of Hooks
let foo = (~name, ~surname, _) => {
print_string("name: " ++ name);
print_string("surname: " ++ surname);
};
module State: {
type t('a);
let init: 'a => t('a);
let get: t('a) => 'a;
let set: (t('a), 'a) => unit;
type other;
let compareOther: (other, other) => int = assert(false);
let equalOther: (other, other) => bool = assert(false);
type runtimeValue =
| Undefined
| BoxUndefined(int)
| Null
| Other(other);
module Button = {
type size =
| Small
|
| Medium
| Large;
};
module Button = {
type size =