Created
July 19, 2021 21:22
-
-
Save atacratic/f672a9b38fcc484786892eb5e08c7112 to your computer and use it in GitHub Desktop.
Playing with the Unison distributed API - a `Cell` type: state sharing between tasks
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
-- Contains a piece of state which can be written and read from different tasks. | |
type Cell a = Cell (Channel (CellProto a)) | |
type CellProto a = Read (Channel a) | Write a | |
example = 'let | |
c = Cell.new 1 | |
f = 'let | |
Cell.write 2 c | |
g = 'let | |
Cell.read c | |
tf = Fork.detach f | |
tg = Fork.detach g | |
task.await tf | |
task.await tg | |
Cell.read : Cell a ->{Channels} a | |
Cell.read c = | |
(Cell reqChannel) = c | |
rspChannel = Channels.new | |
Channels.send (Read rspChannel) reqChannel | |
rsp = Channels.receive rspChannel | |
Channels.close rspChannel | |
rsp | |
Cell.write : a -> Cell a ->{Channels} () | |
Cell.write a c = | |
(Cell reqChannel) = c | |
Channels.send (Write a) reqChannel | |
Cell.new : a ->{Channels, Fork t Channels} Cell a | |
Cell.new initial = | |
receiveChannel = Channels.new | |
goCell : a -> Void | |
goCell state = | |
match Channels.receive receiveChannel with | |
Read rspChannel -> | |
Channels.send state rspChannel | |
goCell state | |
Write newState -> | |
goCell newState | |
Fork.detach '(goCell initial) | |
Cell receiveChannel | |
-- this is just a toy: haven't thought about failure, concurrent | |
-- access, or cell termination. Writes should probably have an ack. | |
--- | |
I found and typechecked these definitions in ~/unison/scratch.u. If | |
you do an `add` or `update`, here's how your codebase would change: | |
⍟ These new definitions are ok to `add`: | |
type Cell a | |
type CellProto a | |
Cell.new : a ->{Channels, Fork t Channels} Cell a | |
Cell.read : Cell a ->{Channels} a | |
Cell.write : a -> Cell a ->{Channels} () | |
example : '{Channels, Remote t, Fork t Channels} Nat |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment