From 90fd63f3754e6582b63347100dd861ab7b45f6e0 Mon Sep 17 00:00:00 2001 From: Jukka Aho Date: Fri, 18 Aug 2017 18:35:55 +0300 Subject: [PATCH] New function group_by_element_type Function groups a list of elements to several lists, where each list contains elements of particular type. --- src/elements.jl | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/elements.jl b/src/elements.jl index dfa30ae..9af660c 100644 --- a/src/elements.jl +++ b/src/elements.jl @@ -56,6 +56,24 @@ function filter_by_element_type(element_type, elements) return filter(element -> is_element_type(element, element_type), elements) end +""" + group_by_element_type(elements::Vector{Element}) + +Given a vector of elements, group elements by element type to several vectors. +Returns a dictionary, where key is the element type and value is a vector +containing all elements of type `element_type`. +""" +function group_by_element_type(elements::Vector{Element}) + results = Dict{DataType, Any}() + basis_types = map(element -> typeof(element.properties), elements) + for basis in unique(basis_types) + element_type = Element{basis} + subset = filter(element -> isa(element, element_type), elements) + results[element_type] = convert(Vector{element_type}, subset) + end + return results +end + function setindex!(element::Element, data::Function, field_name) if method_exists(data, Tuple{Element, Vector, Float64}) # create enclosure to pass element as argument