Sha256: 35ef58c94383626a6a0edc03ef24e03eba775262e2e11b82d361ee78868817f1

Contents?: true

Size: 1.47 KB

Versions: 14

Compression:

Stored size: 1.47 KB

Contents

require 'ms/data/simple'

module Ms
  module Data
    module_function
    
    # Initializes a new interleaved data array.
    def new_interleaved(unresolved_data, n=2)
      Interleaved.new(unresolved_data, n=2)
    end
    
    # An Interleaved data array lazily evaluates it's unresolved data as 
    # an interleaved array of n members.  The unresolved data is evaluated 
    # into an array using to_a.
    #
    #   i = Ms::Data::Interleaved.new([1,4,2,5,3,6])
    #   i.unresolved_data    # => [1,4,2,5,3,6]
    #   i.data               # => []
    #   i[0]                 # => [1,2,3]
    #   i[1]                 # => [4,5,6]
    #   i.data               # => [[1,2,3], [4,5,6]]
    #
    class Interleaved < Simple
      attr_reader :n
      
      def initialize(unresolved_data, n=2)
        @n = 2
        super(unresolved_data)
      end
      
      def [](index)
        resolve.data[index]
      end
      
      def resolved?
        !@data.empty?
      end
    
      def resolve
        return(self) if resolved?
        
        unresolved_data = @unresolved_data.to_a
        
        unless unresolved_data.length % n == 0
          raise ArgumentError, "interleaved data must have a number of elements evenly divisible by n (#{n})"
        end
        
        n.times { @data << [] }
        map = @data * (unresolved_data.length/n)
        
        unresolved_data.each_with_index do |item, i|
          map[i] << item
        end

        self
      end
      
    end
  end
end

Version data entries

14 entries across 14 versions & 1 rubygems

Version Path
ms-core-0.0.19 lib/ms/data/interleaved.rb
ms-core-0.0.18 lib/ms/data/interleaved.rb
ms-core-0.0.17 lib/ms/data/interleaved.rb
ms-core-0.0.16 lib/ms/data/interleaved.rb
ms-core-0.0.14 lib/ms/data/interleaved.rb
ms-core-0.0.13 lib/ms/data/interleaved.rb
ms-core-0.0.12 lib/ms/data/interleaved.rb
ms-core-0.0.11 lib/ms/data/interleaved.rb
ms-core-0.0.10 lib/ms/data/interleaved.rb
ms-core-0.0.9 lib/ms/data/interleaved.rb
ms-core-0.0.7 lib/ms/data/interleaved.rb
ms-core-0.0.6 lib/ms/data/interleaved.rb
ms-core-0.0.5 lib/ms/data/interleaved.rb
ms-core-0.0.4 lib/ms/data/interleaved.rb