Here is my very basic implementation

#= 
A very basic signal / slot library

Usage:

function myslot01(args...; kwargs...)
    println("myslot01 with $args and $kwargs")
end

function myslot02(args...; kwargs...)
    println("myslot02 with $args and $kwargs")
end

function myslot03(a,b; x=-1, y=-1)
    println("myslot03 with a=$a b=$b x=$x y=$y")
end


stop_modified = Signal()
connect(stop_modified, myslot01)
connect(stop_modified, myslot02)
connect(stop_modified, myslot03)
emit(stop_modified, 1, 2, x=1, y=2)
connected = is_connected(stop_modified, myslot01)
println("is_connected(stop_modified, myslot01): $connected")
disconnect(stop_modified, myslot01)
connected = is_connected(stop_modified, myslot01)
println("is_connected(stop_modified, myslot01): $connected")
emit(stop_modified, "a", "b")

=#

using DataStructures

typealias Slot Function

#=
ToDo: it will be possible to do this when Julia will accept anonymous 
function with keyword arguments (v>=0.5)

type Slot
    f::Function
end
call(slot::Slot, args...; kwargs...) = slot.f(args...; kwargs...)

myslot01 = Slot((args...; kwargs...) -> begin
    println("myslot01 with $args and $kwargs")
end)
=#

type Signal
    slots::OrderedDict{Symbol,Slot}

    Signal() = new(OrderedDict())
end

function emit(signal::Signal, args...; kwargs...)
    for (symb, slot) in signal.slots
        slot(args...; kwargs...)
    end
end

function connect(signal::Signal, slot::Slot)
    key = symbol(slot)
    if !haskey(signal.slots, key)
        signal.slots[key] = slot
    else
        error("slot $slot ever connected to $signal")
    end
end

function is_connected(signal::Signal, slot::Slot)
    symbol(slot) in keys(signal.slots)
end

function disconnect(signal::Signal, slot::Slot)
    delete!(signal.slots, symbol(slot))
end





Le mardi 31 mai 2016 02:17:54 UTC+2, Steven G. Johnson a écrit :
>
> Reactive.jl?

Reply via email to