Class: Ms::Data::Interleaved

Inherits:
Simple
  • Object
show all
Defined in:
lib/ms/data/interleaved.rb

Overview

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]]

Instance Attribute Summary collapse

Attributes inherited from Simple

#data, #unresolved_data

Instance Method Summary collapse

Constructor Details

#initialize(unresolved_data, n = 2) ⇒ Interleaved

Returns a new instance of Interleaved.



26
27
28
29
# File 'lib/ms/data/interleaved.rb', line 26

def initialize(unresolved_data, n=2)
  @n = 2
  super(unresolved_data)
end

Instance Attribute Details

#nObject (readonly)

Returns the value of attribute n.



24
25
26
# File 'lib/ms/data/interleaved.rb', line 24

def n
  @n
end

Instance Method Details

#[](index) ⇒ Object



31
32
33
# File 'lib/ms/data/interleaved.rb', line 31

def [](index)
  resolve.data[index]
end

#resolveObject



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/ms/data/interleaved.rb', line 39

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

#resolved?Boolean

Returns:

  • (Boolean)


35
36
37
# File 'lib/ms/data/interleaved.rb', line 35

def resolved?
  !@data.empty?
end