Module: Conversion::EnumerableConverter

Defined in:
lib/conversion/core.rb

Overview

:nodoc:

Class Method Summary collapse

Class Method Details

.to_converter_procObject

See Conversion.converter, Object#convert_to



308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
# File 'lib/conversion/core.rb', line 308

def to_converter_proc
  proc { |converter|
    converter.nil? ? nil :
    proc { |value|
      # challenging recursive mechanism found at http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/20469
      proc { |builder| proc { |f| f.call(f) }.call( proc { |f| builder.call(proc { |*value| f.call(f).call(*value) }) }) }.call(proc { |recurse|
        # the recursive proc
        proc { |value|
          if value.is_a?(Hash)
            value.inject(value.dup.clear) { |h, (key, entry)|
              h[key] = recurse.call(entry)
              h
            }
          elsif value.is_a?(Enumerable) && !value.is_a?(String)
            value.inject(value.dup.clear) { |e, entry|
              e << recurse.call(entry)
            }
          else
            converter.call(value)
          end
        }
      }).call(value)
    }
  }
end