Sha256: 9a78be0339716cf8ddf5a9d6a96abd978a91466ebbeb70caa047791e380f020a

Contents?: true

Size: 1.25 KB

Versions: 2

Compression:

Stored size: 1.25 KB

Contents

require 'set'

module DataMapper
  module Support
    class TypedSet
      
      include ::Enumerable
      
      def initialize(*types)
        @types = types
        @set = SortedSet.new
      end
      
      def <<(item)
        raise ArgumentError.new("#{item.inspect} must be a kind of: #{@types.inspect}") unless @types.any? { |type| type === item }
        @set << item
        return self
      end
      
      def concat(values)
        [*values].each { |item| self << item }
        self
      end
      
      def inspect
        "#<DataMapper::Support::TypedSet#{@types.inspect}: {#{entries.inspect[1...-1]}}>"
      end
      
      def each
        @set.each { |item| yield(item) }
      end
      
      def delete?(item)
        @set.delete?(item)
      end
      
      def size
        @set.size
      end
      alias length size
      
      def empty?
        @set.empty?
      end
      alias blank? empty?
      
      def clear
        @set.clear
      end
      
      def +(other)
        x = self.class.new(*@types)
        each { |entry| x << entry }
        other.each { |entry| x << entry } unless other.blank?
        return x
      end
    end
  end
end

class Class
  
  include Comparable
  
  def <=>(other)
    name <=> other.name
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
datamapper-0.3.1 lib/data_mapper/support/typed_set.rb
datamapper-0.3.0 lib/data_mapper/support/typed_set.rb