Skip to content

Abusing async/await syntax to implement delimited contuations (in a type safe way!)

Notifications You must be signed in to change notification settings

tskj/typescript-delimited-continuation

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Delimited Continuations in Typescript

This is a tiny experiment in pushing javascript as far as it will go. Don't use this in production please. Nevertheless you can try it out:

npm i --save typescript-delimited-continuation

Delimited Continuations is a super cool concept, you can read more about it on Wikipedia. Turns out delimited continuations are isomorphic to Monads, and by god if Promises aren't monadic. And guess what uses Javascript Promises - async/await syntax! The async/await syntax is syntax sugar for promises, so what this library does is abuse promises to hijack the async/await syntax to implement delimited continuations control flow.

What a mouthful. Check out this example from the Wikipedia article in Scheme:

(* 2 (reset (+ 1 (shift k (k 5)))))

Translated to Typescript, this looks like this:

import { reset } from 'typescript-delimited-continuation'

const x =
  await reset<number, number, number>(async (shift) => {
    return 1 + (await shift((k) => k(5)));
  });

const result = 2 * x;

The way this works is that promises essentially capture a continuation because of the way the async/await syntax works, and using this we can devise a simple api to call it directly, like we do in the shift function. Check out the implementation for some comments and more details.

Note this only works if your computations inside reset are pure! Only pure functions, no side effects or you'll suffer the consequences!

About

Abusing async/await syntax to implement delimited contuations (in a type safe way!)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published