Skip to content

Instantly share code, notes, and snippets.

@Brian3647
Created December 10, 2023 10:52
Show Gist options
  • Save Brian3647/5438c068f35432de712653d3477f7c0b to your computer and use it in GitHub Desktop.
Save Brian3647/5438c068f35432de712653d3477f7c0b to your computer and use it in GitHub Desktop.
TypeScript Monad function
interface IMonad<T> {
andThen: <U>(fn: (value: T, finish: () => void) => U) => IMonad<U>;
}
export const Monad = <T>(initial: T, finished = false): IMonad<T> => {
if (finished) {
return {
andThen: <U>(_: (_: T, _: () => void) => U) => {
return Monad(null, true);
},
} as IMonad<T>;
}
return {
andThen: <U>(f: (value: T, finish: () => void) => U) => {
let inner = false;
const result = f(initial, () => {
inner = true;
});
if (inner) {
return Monad(result, true);
}
return Monad(result);
},
} as IMonad<T>;
};
const x = Monad(1);
x.andThen((x) => x + 1)
.andThen((x) => x.toString())
.andThen((x, finish) => {
if (x === '2') {
finish();
}
})
.andThen(() => console.log('hii')); // Never gets executed
@Brian3647
Copy link
Author

Supports async/await too

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment