mirror of
https://github.com/idris-lang/Idris2.git
synced 2024-12-23 19:54:50 +03:00
bd683938bf
Co-authored-by: Guillaume ALLAIS <guillaume.allais@ens-lyon.org>
44 lines
910 B
Idris
44 lines
910 B
Idris
module System.Future
|
|
|
|
%default total
|
|
|
|
-- Futures based Concurrency and Parallelism
|
|
|
|
export
|
|
data Future : Type -> Type where [external]
|
|
|
|
%extern prim__makeFuture : {0 a : Type} -> Lazy a -> Future a
|
|
|
|
%foreign "scheme:blodwen-await-future"
|
|
prim__awaitFuture : {0 a : Type} -> Future a -> a
|
|
|
|
export
|
|
fork : Lazy a -> Future a
|
|
fork = prim__makeFuture
|
|
|
|
export
|
|
await : Future a -> a
|
|
await f = prim__awaitFuture f
|
|
|
|
public export
|
|
Functor Future where
|
|
map func future = fork $ func (await future)
|
|
|
|
public export
|
|
Applicative Future where
|
|
pure v = fork v
|
|
funcF <*> v = fork $ (await funcF) (await v)
|
|
|
|
public export
|
|
Monad Future where
|
|
join = map await
|
|
v >>= func = join . fork $ func (await v)
|
|
|
|
export
|
|
performFutureIO : HasIO io => Future (IO a) -> io (Future a)
|
|
performFutureIO = primIO . prim__io_pure . map unsafePerformIO
|
|
|
|
export
|
|
forkIO : HasIO io => IO a -> io (Future a)
|
|
forkIO a = performFutureIO $ fork a
|