Install/use it like
using ProxyInterfacesIt gives you access to macros which define standard interfaces for your custom proxy type. Currently, the following interfaces are supported:
- iterator (implementation, tests)
- indexing (implementation, tests)
- indexing_mutable (implementation, tests)
- array (implementation, tests)
- array_mutable (implementation, tests)
- dict (implementation, tests)
- dict_mutable (implementation, tests)
In addition it also exports the famous @forward MyWrapper.myfield func1, func2, func3 helper, for quick method
forwarding to a struct field.
Let's take an example proxy type. A proxy type is understood as a type which wraps another type.
struct DictProxy{K, V}
dict::Dict{K, V}
endIn this case it only wraps the standard dict with an additional Tag, namely the Type DictProxy itself.
You can now define standard dict functionality for your proxy with the following three lines
ProxyInterfaces.dict(::Type{DictProxy{K,V}}) where {K, V} = Dict{K, V}
ProxyInterfaces.dict(p::DictProxy) = p.dict
ProxyInterfaces.@dict DictProxyWith this you can now use standard dict syntax for your DictProxy
d = DictProxy(Dict(:a => 1, :b => c))
d[:a] # 1
keys(d) # [:a, :b]
values(d) # [1, 2]
haskey(d, :b) # true
# d[:c] = 5 # WONT'T WORK because this is the immutable interface. use `ProxyInterfaces.dict_mutable` and it will workOnly these three steps are needed for every ProxyInterfaces respectivename:
- overwrite
ProxyInterfaces.respectivename(::Type{YourProxyType})to define how the proxy TYPE maps to the original type - overwrite
ProxyInterfaces.respectivename(p::YourProxyType)to extract the underlying original out of the given proxy instance - call
ProxyInterfaces.@respectivename
Help is highly appreciated. There are many interfaces in Julia which are defined by documentation rather than code. This package ProxyInterfaces can work as a code reference.
In case you are missing a standard interface or a concrete function for an already supported interface, please open an issue. Pull request are also highly welcome.