private with Ada.Synchronous_Task_Control; package Task_Coroutines.Coroutine with Preelaborate is type Inner_Control is tagged limited private; procedure Yield (This : in out Inner_Control); function Clock (This : Inner_Control) return Duration; procedure Delay_Seconds (This : in out Inner_Control; Dur : Duration); generic with function Wait_Cond return Boolean; procedure Wait_For (This : in out Inner_Control); type Instance is tagged limited private; type Coro_Proc is access procedure (Ctrl : in out Inner_Control'Class); procedure Start (This : aliased in out Instance; Proc : not null Coro_Proc); procedure Stop (This : in out Instance); procedure Poll (This : in out Instance; Dt : Duration := 0.0); function Done (This : Instance) return Boolean; private type Inner_Acc is access all Inner_Control'Class; type Outer_Acc is access all Instance'Class; task type Coro_Task is entry Start (Inner : not null Inner_Acc; Proc : not null Coro_Proc); end Coro_Task; type Instance is tagged limited record T : Coro_Task; Is_Done : Boolean := False; Suspend : Ada.Synchronous_Task_Control.Suspension_Object; Inner : aliased Inner_Control; end record; type Inner_Control is tagged limited record Outer : Outer_Acc; Time : Duration; Suspend : Ada.Synchronous_Task_Control.Suspension_Object; end record; end Task_Coroutines.Coroutine;