module Riffle::Array

Public Instance Methods

riffle(*args) click to toggle source
# File lib/riffle/array.rb, line 4
def riffle(*args)
  result = []

  # handle empty or insufficient args
  if self == ::Array && args.length < 2
    return args.empty? ? [] : args.first
  elsif self.is_a?(::Array) && args.empty?
    return self
  end

  opts = get_opts_from_args(args)

  opts[:range] ||= (1..3)

  unless args.select { |a| !a.is_a? ::Array }.empty?
    raise ArgumentError, "All arguments must be of type `Array`"
  end

  # insert self at front of args list if self is an Array instance
  args.unshift self if self.is_a?(::Array)

  # Random.new(nil) explodes for some reason...
  if opts[:seed].nil?
    prng = Random.new
  else
    prng = Random.new(opts[:seed])
  end

  until args.flatten.empty?
    args.each_with_index do |arg, i|
      group_size = prng.rand(opts[:range])
      if arg.length < group_size
        result.concat arg
        args[i] = []
      else
        result.concat arg.take(group_size)
        args[i] = arg.drop group_size
      end
    end
  end

  result
end

Private Instance Methods

get_opts_from_args(args) click to toggle source
# File lib/riffle/array.rb, line 50
def get_opts_from_args(args)
  opts_passed?(args) ? args.pop : {}
end
opts_passed?(args) click to toggle source
# File lib/riffle/array.rb, line 54
def opts_passed?(args)
  args.length > 1 && args.last.is_a?(Hash)
end