mirror of
https://github.com/unisonweb/unison.git
synced 2024-11-14 07:51:12 +03:00
101 lines
2.8 KiB
Plaintext
101 lines
2.8 KiB
Plaintext
|
||
-- memoization of `forkAt` seems really useful, lets you incrementally recompute batch jobs
|
||
-- it would be cool if you could memoize to either ephemeral or durable storage
|
||
-- you could have memoization be a global decision made by the handler, but this is not enough control - you don't want to memoize everything
|
||
-- also want to be able to race computations and whichever finished first you use its result
|
||
|
||
ability Remote t g where
|
||
-- forkAt : Location -> '{g} a -> () -- no
|
||
forkAt : Location -> '{g} a -> t a
|
||
fail : Failure -> x
|
||
here : Location
|
||
|
||
-- could split this up into r/w x ephemeral/durable
|
||
-- await/ephemeral could be in read-only
|
||
-- put could be in write
|
||
ephemeral : Location -> id a -> t a
|
||
durable : Location -> id a -> t a
|
||
lexical : Location -> id a -> t a
|
||
finished : t a -> Boolean
|
||
await : t a -> a
|
||
put : a -> t a -> ()
|
||
|
||
forkAt alice 'let
|
||
..
|
||
put
|
||
|
||
---
|
||
|
||
-- where Mode
|
||
forkAt : Location -> '{g} a -> t a
|
||
-- issue with this is you want to check the cache before
|
||
-- launching the task!
|
||
cache : Mode -> t a -> t
|
||
|
||
-- IVar Ephemeral a
|
||
ephemeral : Location -> id a -> IVar Ephemeral a
|
||
-- IVar Durable a
|
||
durable : Location -> id a -> IVar Durable a
|
||
finished : IVar s a -> Boolean
|
||
await : IVar a -> s a
|
||
put : a -> IVar a -> ()
|
||
|
||
'{Remote t {IVars}} Nat
|
||
|
||
memoAt : Location -> '{g} a ->{Remote t g} (IVar a)
|
||
memoAt loc c =
|
||
ivar = IVars.new c
|
||
if finished ivar then
|
||
await ivar
|
||
else
|
||
forkAt loc 'let
|
||
t = forkAt loc c
|
||
a = await t
|
||
IVars.put a ivar
|
||
ivar
|
||
|
||
--
|
||
-- {Remote t {IVars}} x
|
||
ability IVars where
|
||
-- IVar Ephemeral a
|
||
ephemeral : Location -> id a -> IVar Ephemeral a
|
||
-- IVar Durable a
|
||
durable : Location -> id a -> IVar Durable a
|
||
finished : IVar s a -> Boolean
|
||
await : IVar a -> s a
|
||
put : a -> IVar a -> ()
|
||
|
||
ability IVars.R where
|
||
-- IVar Ephemeral a
|
||
-- ephemeral : Location -> id a -> IVar Ephemeral a
|
||
-- IVar Durable a
|
||
-- durable : Location -> id a -> IVar Durable a
|
||
finished : IVar s a -> Boolean
|
||
await : IVar a -> s a
|
||
-- put : a -> IVar a -> ()
|
||
|
||
ability IVars.Durable.W where
|
||
-- IVar Ephemeral a
|
||
ephemeral : Location -> id a -> IVar Ephemeral a
|
||
-- IVar Durable a
|
||
durable : Location -> id a -> IVar Durable a
|
||
put : a -> IVar a -> ()
|
||
|
||
-- ask for the hash that was used to compute it
|
||
-- cancel :
|
||
|
||
|
||
---
|
||
|
||
ability IVar where
|
||
|
||
ask the IVar for the hash of what was used to compute it
|
||
areWeThereYetMom - to tell us if it’s still being computed
|
||
read: IVar a -> Optional a
|
||
if this has already been computed, give me a reference to where this data has been put
|
||
|
||
ask the IVar for the hash of what was used to compute it
|
||
areWeThereYetMom - to tell us if it’s still being computed
|
||
read: IVar a -> Optional a
|
||
if this has already been computed, give me a reference to where this data has been put
|