Sha256: 79b3cf2b9d38ece89e16642c839b00e883e44835e9601a57f999d610e9ea59f5

Contents?: true

Size: 1.25 KB

Versions: 2

Compression:

Stored size: 1.25 KB

Contents

# frozen_string_literal: true

module FiftyTwo
  module HasCards
    extend Enumerable
    attr_reader :cards
    delegate :shuffle!, :sort!, :<<, :[], :each, :map, :count, :first, :last, to: :cards

    CardUnavailableError = Class.new(StandardError)

    def initialize(cards = [])
      @cards = cards
    end

    def draw
      cards.shift
    end

    def render
      map(&:render).join(" ")
    end

    def locate(identifier)
      cards.find { |c| c.identifier == identifier.upcase }
    end

    def transfer(card, destination = nil)
      card = locate(card) unless card.is_a?(FiftyTwo::Card)
      raise CardUnavailableError if card.nil?
      raise CardUnavailableError unless cards.include?(card)
      (destination || card.deck) << cards.delete(card)
    end

    FiftyTwo::Suit::ALL.each do |suit|
      define_method(suit.name) { select(suit.name) }
    end

    FiftyTwo::Suit::Color::ALL.each do |color|
      define_method(color.name.pluralize) { select(color.name) }
    end

    [*FiftyTwo::Rank::CATEGORIES, :jack, :king, :queen, :ace].each do |category|
      define_method(category.to_s.pluralize) { select(category) }
    end

    private

    def select(identifier)
      self.class.new(cards.select { |c| c.send("#{identifier}?") })
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
fiftytwo-0.0.2 lib/fiftytwo/has_cards.rb
fiftytwo-0.0.1 lib/fiftytwo/has_cards.rb