Created
September 26, 2011 21:40
-
-
Save Burgestrand/1243487 to your computer and use it in GitHub Desktop.
Proof of concept for a lazy Enumerator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'ostruct' | |
require 'delegate' | |
module Hallon | |
class Enumerator < SimpleDelegator | |
attr_reader :size | |
def initialize(size, pointer, &block) | |
@pointer = pointer | |
@items = Array(0...size) | |
@size = size | |
klass = Class.new(SimpleDelegator) do | |
class_eval(&block) | |
attr_reader :index | |
attr_reader :pointer | |
private :pointer | |
def initialize(index, pointer) | |
@pointer = pointer | |
@index = index | |
end | |
alias_method :__getobj__, :object | |
end | |
super(klass) | |
end | |
def [](*args) | |
result = @items[*args] | |
if result.respond_to?(:map) | |
result.map { |i| new(i, @pointer) } | |
else | |
new(result, @pointer) | |
end | |
end | |
end | |
end | |
tracks = Hallon::Enumerator.new(10, "FFI::Pointer") do | |
def object | |
puts "(object called)" | |
# This represents the real object on this index. | |
OpenStruct.new(:artist => "Kim Burgestrand") | |
end | |
def create_time | |
"(##{index} in #{pointer}) 26 Sept 2011" | |
end | |
def creator | |
"le Kim Burgestrand" | |
end | |
def self.total | |
42 | |
end | |
end | |
puts "Size: #{tracks.size}" | |
puts "Total: #{tracks.total}" | |
puts "Create time: #{tracks[0].create_time}" | |
puts "Creator: #{tracks[0].creator}" | |
puts "Artist: #{tracks[0].artist}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
With this, I want:
owner.items[x]
to be an item that responds to all methods available to items.owner.items[x].y
to equalowner.items_y[x]
owner.items.z
to equalowner.z_items
But it’s merely a proof of concept. I don’t yet know if I consider this a good idea.