# Opaque handle for referencing a fiber submitted to a FiberPool. # # Users receive a Handle when they submit a computation to the FiberPool. # The handle can be used to await the fiber's result or cancel it. # # Handles are opaque - users cannot access the underlying fiber state directly. # All operations go through the FiberPool. # # ## Example # # comp do # handle <- FiberPool.fiber(my_computation) # # ... do other work ... # result <- FiberPool.await!(handle) # result # end defmodule Skuld.Coroutine.Handle do @moduledoc false @type t :: %__MODULE__{ id: term(), pool_id: term() } @enforce_keys [:id, :pool_id] defstruct [:id, :pool_id] @doc """ Create a new handle for a fiber. This is called internally by FiberPool when a fiber is submitted. Users should not create handles directly. ## Parameters - `fiber_id` - The fiber's unique identifier - `pool_id` - The FiberPool's unique identifier """ @spec new(term(), term()) :: t() def new(fiber_id, pool_id) do %__MODULE__{id: fiber_id, pool_id: pool_id} end @doc """ Get the fiber ID from a handle. Used internally by FiberPool to look up the fiber. """ @spec fiber_id(t()) :: term() def fiber_id(%__MODULE__{id: id}), do: id @doc """ Get the pool ID from a handle. Used to verify a handle belongs to the expected pool. """ @spec pool_id(t()) :: term() def pool_id(%__MODULE__{pool_id: pool_id}), do: pool_id end