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