From f54f124646625158ac6e124c8fa84c1a617b1eb1 Mon Sep 17 00:00:00 2001 From: hhaensel Date: Tue, 5 Jul 2022 08:59:53 +0200 Subject: [PATCH 1/2] add a more general validity check for updates --- src/Observables.jl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Observables.jl b/src/Observables.jl index 31da44d..16bd269 100644 --- a/src/Observables.jl +++ b/src/Observables.jl @@ -33,14 +33,14 @@ mutable struct Observable{T} <: AbstractObservable{T} listeners::Vector{Pair{Int, Any}} inputs::Vector{Any} # for map!ed Observables - ignore_equal_values::Bool + isvalid::Union{Nothing, Function} val::T function Observable{T}(; ignore_equal_values::Bool=false) where {T} - return new{T}(Pair{Int, Any}[], [], ignore_equal_values) + return new{T}(Pair{Int, Any}[], [], ignore_equal_values ? !isequal : nothing) end function Observable{T}(@nospecialize(val); ignore_equal_values::Bool=false) where {T} - return new{T}(Pair{Int, Any}[], [], ignore_equal_values, val) + return new{T}(Pair{Int, Any}[], [], ignore_equal_values ? !isequal : nothing, val) end end @@ -79,8 +79,8 @@ listeners(observable::Observable) = observable.listeners Updates the value of an `Observable` to `val` and call its listeners. """ function Base.setindex!(@nospecialize(observable::Observable), @nospecialize(val)) - if observable.ignore_equal_values - isequal(observable.val, val) && return + if !isnothing(observable.isvalid) + observable.isvalid(observable.val, val) || return end observable.val = val return notify(observable) From 00cf4beffe8615e36da4e605b028240faa87b028 Mon Sep 17 00:00:00 2001 From: hhaensel Date: Tue, 5 Jul 2022 09:13:18 +0200 Subject: [PATCH 2/2] add a more general validity check --- src/Observables.jl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Observables.jl b/src/Observables.jl index 16bd269..4620609 100644 --- a/src/Observables.jl +++ b/src/Observables.jl @@ -33,14 +33,14 @@ mutable struct Observable{T} <: AbstractObservable{T} listeners::Vector{Pair{Int, Any}} inputs::Vector{Any} # for map!ed Observables - isvalid::Union{Nothing, Function} + isinvalid::Union{Nothing, Function} val::T function Observable{T}(; ignore_equal_values::Bool=false) where {T} - return new{T}(Pair{Int, Any}[], [], ignore_equal_values ? !isequal : nothing) + return new{T}(Pair{Int, Any}[], [], ignore_equal_values ? isequal : nothing) end function Observable{T}(@nospecialize(val); ignore_equal_values::Bool=false) where {T} - return new{T}(Pair{Int, Any}[], [], ignore_equal_values ? !isequal : nothing, val) + return new{T}(Pair{Int, Any}[], [], ignore_equal_values ? isequal : nothing, val) end end @@ -79,8 +79,8 @@ listeners(observable::Observable) = observable.listeners Updates the value of an `Observable` to `val` and call its listeners. """ function Base.setindex!(@nospecialize(observable::Observable), @nospecialize(val)) - if !isnothing(observable.isvalid) - observable.isvalid(observable.val, val) || return + if !isnothing(observable.isinvalid) + observable.isinvalid(observable.val, val) && return end observable.val = val return notify(observable)