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?