Skip to content

Instantly share code, notes, and snippets.

@jballanc
Created August 23, 2015 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jballanc/19e6b709081682d759dc to your computer and use it in GitHub Desktop.
Save jballanc/19e6b709081682d759dc to your computer and use it in GitHub Desktop.
immutable DefaultDict{K, V} <: Associative{K, V}
dict::Dict{K, V}
default::V
end
function DefaultDict(val)
return DefaultDict(Dict(), val)
end
function Base.getindex{K, V}(dd::DefaultDict{K, V}, key::K)
if haskey(dd.dict, key)
getindex(dd.dict, key)
else
dd.default
end
end
Base.convert(::Type{Associative}, dd::DefaultDict) = dd.dict
Base.promote_rule(::Type{Associative}, ::Type{DefaultDict}) = Associative
#= Why don't we get these for free with `convert` and `promote_rule`?
Base.setindex!{K, V}(dd::DefaultDict{K, V}, key::K, val::V) = setindex!(dd.dict, key, val)
Base.length(dd::DefaultDict) = length(dd.dict)
=#
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment