On 12.01.2011 15:41, Guilherme Vieira wrote:
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
How is it better then built-in language feature? This works just fine:
    void main()
    {
//they can't be scope  and compiler enforces this (+ scope is deprecated)
//actually, the orignal code is unsafe - what hapens if adapted delegate escapes current scope?
        auto s = new Switch();
        auto b = new ToggleButton();


        s.watch = (Switch.State a){ b.toggled = cast(bool)a; };
        s.trigger(); // prints `ToggleButton.toggled(true)`
        s.trigger(); // prints `ToggleButton.toggled(false)`
        s.trigger(); // prints `ToggleButton.toggled(true)`
        s.trigger(); // prints `ToggleButton.toggled(false)`
    }

--
Dmitry Olshansky

Reply via email to