Any way of doing `f(::T) where Base.issingletontype(T)`?

Basically I want a dynamic union of singleton types.

Traits.

f(x::T) where T = _f(Val(Base.issingletontype(T)), x)
_f(::Val{true}, x) = "I am a singleton"
_f(::Val{false}, x) = "I ain't a singleton, I have a gazillion of possible values."

julia> f(Base.HasLength())
"I am a singleton"

julia> f([1])
"I ain't a singleton, I have a gazillion of possible values."
2 Likes

There’s nothing built into the language (other than custom trait solutions) that allows you to dispatch on arbitrary predicates, no.

2 Likes

Thanks. However I don’t own the function name so I can’t change the general fallback.

You can wrap the function then in a similar way, eg

f(x::T) where T = _f(Val(Base.issingletontype(T)), x)
_f(::Val{true}, x) = "I am a singleton"
_f(::Val{false}, x) = g(x) # g is the function you do not own

and use f for your own purposes.

If this is not possible, you can make a feature request for the package that owns g, to add a trait-based extension.

3 Likes