Thin delegate adapter

Guilherme Vieira n2.nitrogen at gmail.com
Wed Jan 12 04:41:23 PST 2011


Hi,

I'm wondering if a delegate adapter template like isn't handy for Phobos (it
may be especially useful for std.signal):

class Switch
{
    enum State { ON, OFF }

    void trigger()
    {
        switch (mState)
        {
            case State.ON: mState = State.OFF; break;
            case State.OFF: mState = State.ON; break;
            default: break;
        }

        if (watch !is null) watch(mState);
    }

    void delegate(State s) watch;

    private State mState;
}

class ToggleButton
{
    @property toggled(bool toggled)
    {
        writeln("ToggleButton.toggled(", toggled, ")");
    }
}

void main()
{
    scope s = new Switch();
    scope b = new ToggleButton();

    s.watch = &b.toggled; // error: invalid conversion
    s.watch = adapt!("obj.toggled = cast(bool)(a)", Switch.State)(b);

    s.trigger(); // prints `ToggleButton.toggled(true)`
    s.trigger(); // prints `ToggleButton.toggled(false)`
    s.trigger(); // prints `ToggleButton.toggled(true)`
    s.trigger(); // prints `ToggleButton.toggled(false)`
}


Yes, it urges to be polished. Particularly, it doesn't support multiple
arguments. I also wanted to place the argument type tuple somwhere else
(actually wanted to hide it completely, but I think that's not possible).

Feedback?

-- 
Atenciosamente / Sincerely,
Guilherme ("n2liquid") Vieira
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/digitalmars-d/attachments/20110112/a368eb32/attachment-0001.html>


More information about the Digitalmars-d mailing list