github.com/xg0n/routine@v0.0.0-20240119033701-c364deb94aee/api_future_task.go (about)

     1  package routine
     2  
     3  import "time"
     4  
     5  // FutureCallable provides a future function that returns a value of type TResult.
     6  type FutureCallable[TResult any] func(task FutureTask[TResult]) TResult
     7  
     8  // CancelToken propagates notification that operations should be canceled.
     9  type CancelToken interface {
    10  	// IsCanceled returns true if task was canceled.
    11  	IsCanceled() bool
    12  
    13  	// Cancel notifies the waiting coroutine that the task has canceled and returns stack information.
    14  	Cancel()
    15  }
    16  
    17  // FutureTask provide a way to wait for the sub-coroutine to finish executing, get the return value of the sub-coroutine, and catch the sub-coroutine panic.
    18  type FutureTask[TResult any] interface {
    19  	// IsDone returns true if completed in any fashion: normally, exceptionally or via cancellation.
    20  	IsDone() bool
    21  
    22  	// IsCanceled returns true if task was canceled.
    23  	IsCanceled() bool
    24  
    25  	// IsFailed returns true if completed exceptionally.
    26  	IsFailed() bool
    27  
    28  	// Complete notifies the waiting coroutine that the task has completed normally and returns the execution result.
    29  	Complete(result TResult)
    30  
    31  	// Cancel notifies the waiting coroutine that the task has canceled and returns stack information.
    32  	Cancel()
    33  
    34  	// Fail notifies the waiting coroutine that the task has terminated due to panic and returns stack information.
    35  	Fail(error any)
    36  
    37  	// Get return the execution result of the sub-coroutine, if there is no result, return nil.
    38  	// If task is canceled, a panic with cancellation will be raised.
    39  	// If panic is raised during the execution of the sub-coroutine, it will be raised again at this time.
    40  	Get() TResult
    41  
    42  	// GetWithTimeout return the execution result of the sub-coroutine, if there is no result, return nil.
    43  	// If task is canceled, a panic with cancellation will be raised.
    44  	// If panic is raised during the execution of the sub-coroutine, it will be raised again at this time.
    45  	// If the deadline is reached, a panic with timeout error will be raised.
    46  	GetWithTimeout(timeout time.Duration) TResult
    47  
    48  	// Run execute the task, the method can be called repeatedly, but the task will only execute once.
    49  	Run()
    50  }
    51  
    52  // NewFutureTask Create a new instance.
    53  func NewFutureTask[TResult any](callable FutureCallable[TResult]) FutureTask[TResult] {
    54  	if callable == nil {
    55  		panic("callable can not be nil.")
    56  	}
    57  	task := &futureTask[TResult]{callable: callable}
    58  	task.await.Add(1)
    59  	return task
    60  }