Chunk an Enumerable into fixed-size batches

Crystal
def chunks(items : Enumerable(T), size : Int32) : Array(Array(T)) forall T
  raise ArgumentError.new("size must be positive") if size <= 0
  batches = [] of Array(T)
  current = [] of T
  items.each do |item|
    current << item
    next unless current.size == size
    batches << current
    current = [] of T
  end
  batches << current unless current.empty?
  batches
end

chunks((1..7), 3).each { |batch| p batch }