Sha256: d202cf0339c8b3ac44d309af03b8005f4c56a999bcfbd50be8fbd91d413738ed

Contents?: true

Size: 1.46 KB

Versions: 109

Compression:

Stored size: 1.46 KB

Contents

# frozen_string_literal: true

class ReeArray::InGroupsOf
  include Ree::FnDSL

  fn :in_groups_of

  doc(<<~DOC)
    Splits or iterates over the array in groups of size +number+,
    padding any remaining slots with +fill_with+ unless it is +false+.
    
      in_groups_of(%w(1 2 3 4 5 6 7 8 9 10), 3, fill_with: nil) {|group| p group}
      ["1", "2", "3"]
      ["4", "5", "6"]
      ["7", "8", "9"]
      ["10", nil, nil]
    
      in_groups_of(%w(1 2 3 4 5), 2, fill_with: '&nbsp;') {|group| p group}
      ["1", "2"]
      ["3", "4"]
      ["5", "&nbsp;"]
    
      in_groups_of(%w(1 2 3 4 5), 2) {|group| p group}
      ["1", "2"]
      ["3", "4"]
      ["5"]
  DOC
  contract(
    ArrayOf[Any],
    Integer,
    Ksplat[fill_with?: Any],
    Optblock => Or[ArrayOf[Any], ArrayOf[ArrayOf[Any]]]
  ).throws(ArgumentError)
  def call(array, number, **opts, &block)
    if number.to_i <= 0
      raise ArgumentError,
        "Group size must be a positive integer, was #{number.inspect}"
    end

    collection = if opts.has_key?(:fill_with)
      # size % number gives how many extra we have;
      # subtracting from number gives how many to add;
      # modulo number ensures we don't add group of just fill.
      padding = (number - array.size % number) % number
      array.dup.concat(Array.new(padding, opts[:fill_with]))
    else
      array
    end

    if block_given?
      collection.each_slice(number, &block)
    else
      collection.each_slice(number).to_a
    end
  end
end

Version data entries

109 entries across 109 versions & 1 rubygems

Version Path
ree_lib-1.0.49 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.48 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.47 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.46 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.45 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.44 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.43 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.42 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.41 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.40 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.39 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.38 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.37 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.36 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.35 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.34 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.33 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.32 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.31 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb
ree_lib-1.0.30 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups_of.rb