with Ada.Calendar;
with Rx.Errors;
with Rx.Impl.Shared_Observer;
with Rx.Impl.Preservers;
with Rx.Impl.Typed;
package Rx.Dispatchers is
pragma Elaborate_Body;
type Dispatcher is limited interface;
type Runnable is interface;
procedure Run (This : Runnable) is abstract;
-- Schedule a code to be run at a certain time, in a certain scheduler (thread)
procedure Schedule (Where : in out Dispatcher;
What : Runnable'Class;
Time : Ada.Calendar.Time := Ada.Calendar.Clock) is abstract;
generic
with package Typed is new Rx.Impl.Typed (<>);
package Events is
package Shared is new Rx.Impl.Shared_Observer (Typed);
procedure On_Next (Sched : in out Dispatcher'Class; Observer : Shared.Observer; V : Typed.Type_Traits.T);
procedure On_Complete (Sched : in out Dispatcher'Class; Observer : Shared.Observer);
procedure On_Error (Sched : in out Dispatcher'Class; Observer : Shared.Observer; E : Rx.Errors.Occurrence);
end Events;
generic
with package Operate is new Rx.Impl.Preservers (<>);
package Subscribe is
procedure On_Subscribe (Sched : in out Dispatcher'Class;
Parent : Operate.Observable'Class;
Child : Operate.Into.Observer'Class);
end Subscribe;
procedure Shutdown;
-- Signal schedulers to exit.
-- Necessary when there are infinite sequences going on (e.g. Interval)
function Terminating return Boolean;
-- Will be true after shutdown has been invoked
end Rx.Dispatchers;