module Eco module API class UseCases class OozeSamples module Helpers module OozeHandlers def merge_values(origin, append, klass: nil, delimiter: "\n") return origin if !append || append.to_s.strip.empty? return append if !origin || origin.to_s.strip.empty? case klass when Ecoportal::API::V2::Page::Component::RichTextField merge_values(origin, append, delimiter: "\n") when Ecoportal::API::V2::Page::Component::PlainTextField merge_values(origin, append, delimiter: "\n") when Ecoportal::API::V2::Page::Component::SelectionField merge_values(origin, append, delimiter: delimiter) when Ecoportal::API::V2::Page::Component::ReferenceField merge_values(origin, append, delimiter: delimiter) when Ecoportal::API::V2::Page::Component::PeopleField merge_values(origin, append, delimiter: delimiter) when Ecoportal::API::V2::Page::Component::DateField origin when Ecoportal::API::V2::Page::Component::NumberField origin when Ecoportal::API::V2::Page::Component::GaugeField origin when Ecoportal::API::V2::Page::Component::ChecklistField merge_values(origin, append, delimiter: delimiter) when Ecoportal::API::V2::Page::Component::ActionField merge_values(origin, append, delimiter: delimiter) when Ecoportal::API::V2::Page::Component::FilesField merge_values(origin, append, delimiter: delimiter) when Ecoportal::API::V2::Page::Component::ImagesField merge_values(origin, append, delimiter: delimiter) when Ecoportal::API::V2::Page::Component::GeoField merge_values(origin, append, delimiter: delimiter) when Ecoportal::API::V2::Page::Component::LawField merge_values(origin, append, delimiter: delimiter) else [origin, append].join(delimiter) end end def merge_arrays(ref, plus) return ref if ref == plus href_idx = array_indexes(ref) hplus_idx = array_indexes(plus) shared = ref & plus hshared_ref_idx = href_idx.slice(*shared) # hidx_plus_shared = hplus_idx.slice(*shared).each_with_object({}) do |(e, idx), reversed| # reversed[idx] = e # end # shared_plus_idxs = hidx_plus_shared.keys.reverse shared_plus_idxs = hplus_idx.values_at(*shared).sort.reverse only_plus = plus - ref honly_plus_idx = hplus_idx.slice(*only_plus) hplus_ref_idx = honly_plus_idx.each_with_object({}) do |(e, idx), hplus_ref_idx| ps_idx = shared_plus_idxs.bsearch {|i| idx >= i} rs_idx = ps_idx ? hshared_ref_idx[plus[ps_idx]] : -1 hplus_ref_idx[e] = rs_idx end.group_by do |e, idx| idx end.to_a.sort_by do |(idx, pairs)| idx end.reverse.to_h.transform_values do |pairs| pairs.map(&:first) end hplus_ref_idx.each_with_object(ref.dup) do |(idx, elements), ref| ref.insert(idx+1, *elements) end end def array_indexes(ary) ary.each_with_index.to_h end end end end end end end