Sha256: 12808012339a7720fb8e2dbe7e0a86e82289009324ac8d8040e8cee666180f66

Contents?: true

Size: 1.54 KB

Versions: 3

Compression:

Stored size: 1.54 KB

Contents

module PyCall
  class List
    include PyObjectWrapper
    include Enumerable

    def self.new(init=nil)
      case init
      when PyObject
        super
      when nil
        new(0)
      when Integer
        new(LibPython.PyList_New(init))
      when Array
        new.tap do |list|
          init.each do |item|
            list << item
          end
        end
      else
        new(obj.to_ary)
      end
    end

    def initialize(pyobj)
      super(pyobj, LibPython.PyList_Type)
    end

    def [](index)
      LibPython.PyList_GetItem(__pyobj__, index).to_ruby
    end

    def []=(index, value)
      value = Conversions.from_ruby(value)
      LibPython.PyList_SetItem(__pyobj__, index, value)
      value
    end

    def <<(value)
      value = Conversions.from_ruby(value)
      LibPython.PyList_Append(__pyobj__, value)
      self
    end

    def size
      LibPython.PyList_Size(__pyobj__)
    end

    def include?(value)
      value = Conversions.from_ruby(value)
      value = LibPython.PySequence_Contains(__pyobj__, value)
      raise PyError.fetch if value == -1
      1 == value
    end

    def ==(other)
      case other
      when Array
        self.to_a == other
      else
        super
      end
    end

    def each
      return enum_for unless block_given?
      i, n = 0, size
      while i < n
        yield self[i]
        i += 1
      end
      self
    end

    def to_a
      [].tap do |a|
        i, n = 0, size
        while i < n
          a << self[i]
          i += 1
        end
      end
    end

    alias to_ary to_a
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
pycall-0.1.0.alpha.20170307 lib/pycall/list.rb
pycall-0.1.0.alpha.20170302 lib/pycall/list.rb
pycall-0.1.0.alpha.20170226 lib/pycall/list.rb