aboutsummaryrefslogtreecommitdiff
path: root/entries/braxtonh/types
diff options
context:
space:
mode:
Diffstat (limited to 'entries/braxtonh/types')
-rw-r--r--entries/braxtonh/types/index.ts18
-rw-r--r--entries/braxtonh/types/test.ts19
2 files changed, 37 insertions, 0 deletions
diff --git a/entries/braxtonh/types/index.ts b/entries/braxtonh/types/index.ts
new file mode 100644
index 0000000..11f4086
--- /dev/null
+++ b/entries/braxtonh/types/index.ts
@@ -0,0 +1,18 @@
+type Zero = "😰";
+
+type Succ<N> = {prev: N};
+
+type Prev<N> = N extends Succ<infer P> ? P : never;
+
+type Add<A, B> = B extends Zero ? A : Succ<Add<A, Prev<B>>>;
+
+type _Fib<N, AccumulatorA, AccumulatorB> =
+ N extends Zero
+ ? AccumulatorA
+ : N extends Succ<Zero>
+ ? AccumulatorB
+ : _Fib<Prev<N>, AccumulatorB, Add<AccumulatorA, AccumulatorB>>;
+
+type Fib<N> = _Fib<N, Zero, Succ<Zero>>;
+
+export type {Zero, Succ, Fib};
diff --git a/entries/braxtonh/types/test.ts b/entries/braxtonh/types/test.ts
new file mode 100644
index 0000000..2ce83e7
--- /dev/null
+++ b/entries/braxtonh/types/test.ts
@@ -0,0 +1,19 @@
+import {Zero, Succ, Fib} from "./index";
+
+const zero: Zero = "😰";
+const one: Succ<typeof zero> = {prev: zero};
+const two: Succ<typeof one> = {prev: one};
+const three: Succ<typeof two> = {prev: two};
+const four: Succ<typeof three> = {prev: three};
+const five: Succ<typeof four> = {prev: four};
+const six: Succ<typeof five> = {prev: five};
+const seven: Succ<typeof six> = {prev: six};
+const eight: Succ<typeof seven> = {prev: seven};
+
+const fibZero: Fib<typeof zero> = zero;
+const fibOne: Fib<typeof one> = one;
+const fibTwo: Fib<typeof two> = one;
+const fibThree: Fib<typeof three> = two;
+const fibFour: Fib<typeof four> = three;
+const fibFive: Fib<typeof five> = five;
+const fibSix: Fib<typeof six> = eight;