Last active
July 3, 2022 12:08
-
-
Save Lucifier129/d05800b93f20a8279e71acf0ca6962f6 to your computer and use it in GitHub Desktop.
some codata examples in javascript/typescript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
interface BtreeVisitor<T, TT> { | |
leaf: (value: T) => TT; | |
branch: (left: TT, right: TT) => TT; | |
} | |
interface Btree<T> { | |
<TT>(visitor: BtreeVisitor<T, TT>): TT; | |
} | |
const leaf = <T>(value: T): Btree<T> => { | |
return (visitor) => visitor.leaf(value); | |
}; | |
const branch = <T>(left: Btree<T>, right: Btree<T>): Btree<T> => { | |
return (visitor) => { | |
return visitor.branch(left(visitor), right(visitor)); | |
}; | |
}; | |
// reverse binary tree | |
const reverse = <T>(btree: Btree<T>): Btree<T> => { | |
return btree({ | |
leaf: (value) => leaf(value), | |
branch: (left, right) => branch(right, left), | |
}); | |
}; | |
type Data_BTree<T> = | |
| { | |
type: 'leaf'; | |
value: T; | |
} | |
| { | |
type: 'branch'; | |
left: Data_BTree<T>; | |
right: Data_BTree<T>; | |
}; | |
// data constructors | |
const dataBtreeConstructors = { | |
leaf: <T>(value: T): Data_BTree<T> => ({ | |
type: 'leaf', | |
value, | |
}), | |
branch: <T>(left: Data_BTree<T>, right: Data_BTree<T>): Data_BTree<T> => ({ | |
type: 'branch', | |
left, | |
right, | |
}), | |
}; | |
const toDataBTree = <T>(btree: Btree<T>): Data_BTree<T> => { | |
// codata to data is easy | |
return btree({ | |
leaf: dataBtreeConstructors.leaf, | |
branch: dataBtreeConstructors.branch, | |
}); | |
}; | |
const toSourceCode = <T>(btree: Btree<T>): string => { | |
return btree({ | |
leaf: (value) => `leaf(${value})`, | |
branch: (left, right) => `branch(${left}, ${right})`, | |
}); | |
}; | |
const btree = branch( | |
branch(leaf(0), branch(leaf(1), leaf(2))), | |
branch(leaf(3), leaf(4)) | |
); | |
const btreeData = toDataBTree(btree); | |
const btreeCode = toSourceCode(btree); | |
const reversedBtree = reverse(btree); | |
const reversedBtreeData = toDataBTree(reversedBtree); | |
const reversedBtreeCode = toSourceCode(reversedBtree); | |
console.log('btreeData', JSON.stringify(btreeData, null, 2)); | |
console.log('btreeCode', btreeCode); | |
console.log('reversedBtreeData', JSON.stringify(reversedBtreeData, null, 2)); | |
console.log('reversedBtreeCode', reversedBtreeCode); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
pullable & pushable streaming