Sha256: 650926be5f60ca88efe7ae5a81ffaa4c8d2fb48794a0b3f531ffc4e6d7bc382b

Contents?: true

Size: 1.54 KB

Versions: 17

Compression:

Stored size: 1.54 KB

Contents

# frozen_string_literal: true

class ReeArray::InGroups
  include Ree::FnDSL

  fn :in_groups

  doc(<<~DOC)
    Splits or iterates over the array in +number+ of groups, padding any
    remaining slots with +fill_with+ unless it is +false+.

      in_groups(%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", nil]
      ["8", "9", "10", nil]

      in_groups(%w(1 2 3 4 5 6 7 8 9 10, 3, fill_with: '&nbsp;') {|group| p group}
      ["1", "2", "3", "4"]
      ["5", "6", "7", "&nbsp;"]
      ["8", "9", "10", "&nbsp;"]

      in_groups(%w(1 2 3 4 5 6 7), 3) {|group| p group}
      ["1", "2", "3"]
      ["4", "5"]
      ["6", "7"]
  DOC
  contract(
    Or[ArrayOf[Any], Enumerable],
    Integer,
    Ksplat[fill_with?: Any],
    Optblock => Or[ArrayOf[Any], Any]
  )
  def call(array, number, **opts, &block)
    # size.div number gives minor group size;
    # size % number gives how many objects need extra accommodation;
    # each group hold either division or division + 1 items.
    division = array.size.div(number)
    modulo = array.size % number

    # create a new array avoiding dup
    groups = []
    start = 0

    number.times do |index|
      length = division + (modulo > 0 && modulo > index ? 1 : 0)
      groups << last_group = array.slice(start, length)

      if opts.has_key?(:fill_with) && modulo > 0 && length == division
        last_group << opts[:fill_with]
      end

      start += length
    end

    if block_given?
      groups.each(&block)
    else
      groups
    end
  end
end

Version data entries

17 entries across 17 versions & 1 rubygems

Version Path
ree_lib-1.1.1 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.1.0 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.0.124 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.0.123 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.0.122 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.0.121 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.0.120 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.0.119 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.0.118 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.0.117 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.0.116 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.0.115 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.0.114 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.0.113 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.0.112 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.0.111 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb
ree_lib-1.0.110 lib/ree_lib/packages/ree_array/package/ree_array/functions/in_groups.rb