| /- | |
| Copyright (c) 2022 Microsoft Corporation. All rights reserved. | |
| Released under Apache 2.0 license as described in the file LICENSE. | |
| Authors: Gabriel Ebner | |
| -/ | |
| prelude | |
| import Init.System.IO | |
| set_option linter.missingDocs true | |
| namespace IO | |
| private opaque PromisePointed : NonemptyType.{0} | |
| private structure PromiseImpl (α : Type) : Type where | |
| prom : PromisePointed.type | |
| h : Nonempty α | |
| /-- | |
| `Promise α` allows you to create a `Task α` whose value is provided later by calling `resolve`. | |
| Typical usage is as follows: | |
| 1. `let promise ← Promise.new` creates a promise | |
| 2. `promise.result : Task α` can now be passed around | |
| 3. `promise.result.get` blocks until the promise is resolved | |
| 4. `promise.resolve a` resolves the promise | |
| 5. `promise.result.get` now returns `a` | |
| Every promise must eventually be resolved. | |
| Otherwise the memory used for the promise will be leaked, | |
| and any tasks depending on the promise's result will wait forever. | |
| -/ | |
| def Promise (α : Type) : Type := PromiseImpl α | |
| instance [s : Nonempty α] : Nonempty (Promise α) := | |
| Nonempty.intro { prom := Classical.choice PromisePointed.property, h := s } | |
| /-- Creates a new `Promise`. -/ | |
| @[extern "lean_io_promise_new"] | |
| opaque Promise.new [Nonempty α] : BaseIO (Promise α) | |
| /-- | |
| Resolves a `Promise`. | |
| Only the first call to this function has an effect. | |
| -/ | |
| @[extern "lean_io_promise_resolve"] | |
| opaque Promise.resolve (value : α) (promise : @& Promise α) : BaseIO Unit | |
| /-- | |
| The result task of a `Promise`. | |
| The task blocks until `Promise.resolve` is called. | |
| -/ | |
| @[extern "lean_io_promise_result"] | |
| opaque Promise.result (promise : Promise α) : Task α := | |
| have : Nonempty α := promise.h | |
| Classical.choice inferInstance |