Well, the previous listing worked only for Int vectors. Following is a more properly typed version. Various optimizations are possible: @inbounds, reducing allocations, etc.
function uniquepermutations(base) zpos = Vector{Vector{Vector{Int}}}() zval = Vector{eltype(base)}() left = length(base) for (v,c) in countmap(base) push!(zpos,collect(subsets(collect(1:left),c))) push!(zval,v) left -= c end res = Vector{Vector{eltype(base)}}() for a in product(zpos...) slots = collect(1:length(base)) perm = similar(base) for (val,b) in zip(zval,a) perm[slots[b]] = val slots[b] = 0 slots = filter(x->x>0,slots) end push!(res,perm) end res end