On Sunday, 16 January 2022 at 20:01:09 UTC, JN wrote:
On Saturday, 15 January 2022 at 23:15:16 UTC, JN wrote:

Is there some way I could improve this with some D features? My main gripes with it are:


Managed to dramatically simplify it to 10 lines of code with variadic templates.

```d
import std.stdio;

struct Event(T...)
{
    void function(T)[] listeners;

    void addListener(void function(T) handler)
    {
        listeners ~= handler;
    }

    void emit(T args)
    {
        foreach (listener; listeners)
        {
            listener(args);
        }
    }
}

void onResize(uint newWidth, uint newHeight)
{
    writefln("Resized: %d %d", newWidth, newHeight);
}

void main()
{
    Event!(uint, uint) windowResizeEvent;
    windowResizeEvent.addListener(&onResize);

    windowResizeEvent.emit(1000, 2000);
}
```

I am very happy with this solution.

Looks good. But do note that with larger applications it inevitably becomes a ball of spaghetti, making it hard to understand why a certain widget behaves the way it does (or doesn't).

The other problem - already apparent in this small example - is the absence of `removeListener`. It is a very crucial and often overlooked part that often only gets written afterwards. The problem is that it ties into lifetime which is hard to bolt on.

For small things though, it works wonderfully.

Reply via email to