Sha256: eb3b260716987b9ed74d452319b09c4883e69a23ac67ca4f5fff8d6e5569a2e7
Contents?: true
Size: 1.08 KB
Versions: 2
Compression:
Stored size: 1.08 KB
Contents
require 'arc-furnace/source' # An unfold is the reverse of a fold--it takes a single value an blows it out # into an enumeration of values. Useful for splitting up rows into multiple output # rows and whatnot. Only #unfold is required for implementation. module ArcFurnace class Unfold < Source private_attr_reader :source, :unfolded attr_reader :value def initialize(source:) @source = source advance end def prepare source.prepare end # Given a row from the source, produce the unfolded rows as a result. This method must return # an array. def unfold(row) raise "Unimplemented!" end def empty? value.nil? && source.empty? end def advance while (unfolded.nil? || unfolded.empty?) && !source.empty? # Use reverse since we want to process in-order, but, #pop is much faster than #unshift @unfolded = unfold(source.row.deep_dup) unfolded.reverse! end if unfolded && !unfolded.empty? @value = unfolded.pop else @value = nil end end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
arc-furnace-0.1.3 | lib/arc-furnace/unfold.rb |
arc-furnace-0.1.0 | lib/arc-furnace/unfold.rb |