class ShippingMaterials::Sorter
Public Class Methods
new()
click to toggle source
# File lib/shipping_materials/sorter.rb, line 3 def initialize @rules = [] @attr_callbacks = [] end
Public Instance Methods
each_by(attr)
click to toggle source
This is suiting MY purpose for now The plan is to implement chainable callbacks
# File lib/shipping_materials/sorter.rb, line 14 def each_by(attr) @attr_callbacks << attr end
rule(&block)
click to toggle source
# File lib/shipping_materials/sorter.rb, line 8 def rule(&block) @rules << block end
sort(items, i=0)
click to toggle source
# File lib/shipping_materials/sorter.rb, line 18 def sort(items, i=0) return items if !@rules[i] || items.size < 2 a, b = [], [] items.each do |item| if item.instance_eval(&@rules[i]) a << item else b << item end end apply_callbacks(a) apply_callbacks(b) i += 1 ( sort(a, i) + sort(b, i) ).compact end
Private Instance Methods
apply_callbacks(items)
click to toggle source
# File lib/shipping_materials/sorter.rb, line 41 def apply_callbacks(items) @attr_callbacks.each do |attr| items.sort! do |a,b| b.send(attr) <=> a.send(attr) end end end