with Ada.Exceptions; with Rx.Errors; with Rx.Impl.Typed; generic with package Typed is new Rx.Impl.Typed (<>); package Rx.Impl.Events is type Kinds is (On_Next, On_Complete , On_Error); type Event (Kind : Kinds) is private; function On_Next (V : Typed.T) return Event; function On_Complete return Event; function On_Error (E : Errors.Occurrence) return Event; function On_Error (E : Ada.Exceptions.Exception_Occurrence) return Event; function Value (E : Event) return Typed.T with Pre => E.Kind = On_Next; function Error (E : Event) return Errors.Occurrence with Pre => E.Kind = On_Error; private type Event (Kind : Kinds) is record case Kind is when On_Next => V : Typed.D; when On_Error => E : Errors.Occurrence; when On_Complete => null; end case; end record; use Typed.Conversions; function On_Next (V : Typed.T) return Event is (On_Next, +V); function On_Complete return Event is (Kind => On_Complete ); function On_Error (E : Errors.Occurrence) return Event is (On_Error, E); function On_Error (E : Ada.Exceptions.Exception_Occurrence) return Event is (On_Error, Errors.Create (E)); function Value (E : Event) return Typed.T is (+E.V); function Error (E : Event) return Errors.Occurrence is (E.E); end Rx.Impl.Events;