with Ada.Numerics.Float_Random; with Rx.Debug; package body Rx.Op.Hold is --------------- -- Generator -- --------------- protected Generator is procedure Get (F : out Float); private State : Ada.Numerics.Float_Random.Generator; end Generator; protected body Generator is procedure Get (F : out Float) is begin F := Ada.Numerics.Float_Random.Random (State); end Get; end Generator; ------------ -- Random -- ------------ function Random return Ada.Numerics.Float_Random.Uniformly_Distributed is F : Float; begin Generator.Get (F); return F; end Random; type Operator is new Preserver.Operator with record Fixed, Random: Float; end record; overriding procedure On_Next (This : in out Operator; V : Preserver.T); ------------ -- Create -- ------------ function Create (Fixed : Duration; Random : Duration := 0.0) return Preserver.Operator'Class is begin return Operator'(Preserver.Operator with Fixed => Float (Fixed), Random => Float (Random)); end Create; ------------- -- On_Next -- ------------- overriding procedure On_Next (This : in out Operator; V : Preserver.T) is Pause : constant Float := This.Fixed + This.Random * Random; Dur : constant Duration := Duration (Pause); begin Debug.Trace ("on_next hold:" & Dur'Img); delay Dur; This.Get_Observer.On_Next (V); end On_Next; end Rx.Op.Hold;