Generic Events (non async)

You need to put this code in separate file

Events.verse

# !ATTENTION! use `set` while you subscribing to event
endo_event(t : type) := class:
    Listeners<internal> : []type{_(:t):void} = array{}

    Subscribe<public>(Listener(:t):void) : endo_event(t) =
        endo_event(t):
            Listeners := Listeners + array{Listener}

    Invoke<public>(Value : t) : void =
        for (Listener : Listeners):
            Listener(Value)

Example usage


using { /Fortnite.com/Devices }
using { /Verse.org/Simulation }
using { /UnrealEngine.com/Temporary/Diagnostics }

hello_world_device := class(creative_device):
    var MoneyChangedEvent : endo_event(int) = endo_event(int){} #single parameter
    var AgentLevelUpEvent : endo_event(tuple(agent, int)) = endo_event(tuple(agent, int)){} #multi parameters with tuple

    OnBegin<override>()<suspends> : void =
        set MoneyChangedEvent = MoneyChangedEvent.Subscribe(OnMoneyChanged) #its important to set result of subscription to your event variable

        MoneyChangedEvent.Invoke(20)
        MoneyChangedEvent.Invoke(50)
        MoneyChangedEvent.Invoke(100)


    OnMoneyChanged<private>(Value : int) : void =
        Print("Money changed {Value}")
4 Likes