Sha256: 34323be1d84a8fae391b70f235de9b803c86640aafa0a97932e3a363b7cb1331

Contents?: true

Size: 1007 Bytes

Versions: 2

Compression:

Stored size: 1007 Bytes

Contents

module Alf
  class Buffer
    # 
    # Keeps tuples ordered on a specific key
    #
    # Example:
    #
    #   sorted = Buffer::Sorted.new Ordering.new(...)
    #   sorted.add_all(...)
    #   sorted.each do |tuple|
    #     # tuples are ordered here 
    #   end
    #
    class Sorted < Buffer
  
      #
      # Creates a buffer instance with an ordering key
      #
      def initialize(ordering)
        @ordering = ordering
        @buffer = []
      end
  
      #
      # Adds all elements of an iterator to the buffer
      #
      def add_all(enum)
        sorter = @ordering.sorter
        @buffer = merge_sort(@buffer, enum.to_a.sort(&sorter), sorter)
      end
  
      #
      # (see Buffer#each)
      #
      def each
        @buffer.each(&Proc.new)
      end
  
      private
    
      # Implements a merge sort between two iterators s1 and s2
      def merge_sort(s1, s2, sorter)
        (s1 + s2).sort(&sorter)
      end
  
    end # class Sorted
  end # class Buffer
end # module Alf

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
alf-0.10.1 lib/alf/buffer/sorted.rb
alf-0.10.0 lib/alf/buffer/sorted.rb