ANN: TypeSortedCollections.jl


I recently wrote and registered TypeSortedCollections.jl, a small package that allows you to perform operations on a type-heterogeneous collection in type-stable and statically dispatched fashion. I originally implemented this for use in RigidBodyDynamics.jl, but decided to pull it out into its own package as I hope it will be useful for others as well.

TypeSortedCollections provides the TypeSortedCollection type, which sorts a type-heterogeneous input collection by type upon construction, and stores the elements in a Tuple of concretely typed Vectors, one for each type. TypeSortedCollections provides type stable methods for map!, foreach, and mapreduce that take at least one TypeSortedCollection.

An example (from the readme):

julia> using TypeSortedCollections

julia> f(x::Int64, y::Float64) = x * y
f (generic function with 2 methods)

julia> f(x::Float64, y::Float64) = round(Int64, -x * y)
f (generic function with 2 methods)

julia> xs = Number[1.; 2; 3]; # note the abstract element type; contains both Float64 and Int64

julia> sortedxs = TypeSortedCollection(xs);

julia> ys = [1.; 2.; 3.];

julia> results = Vector{Int64}(length(xs));

julia> map!(f, results, sortedxs, ys)
3-element Array{Int64,1}:

julia> @allocated map!(f, results, sortedxs, ys)

Please check out the readme for additional features and notes (especially on when TypeSortedCollections are appropriate to use), and let me know if you have any questions!