class CursorPaginator::Paginator::Array

Public Instance Methods

paginate(scope) click to toggle source
# File lib/cursor_paginator/paginator/array.rb, line 4
def paginate(scope)
  records = scope.sort_by(&paginator_options.fetch(:order_key))
  records = filter_by_cursor(records) if options_parser.filter_required?
  records = records.reverse if order_direction == :desc

  PaginationResult.new(records, self)
end

Private Instance Methods

filter_by_cursor(collection) click to toggle source
# File lib/cursor_paginator/paginator/array.rb, line 14
def filter_by_cursor(collection)
  cursor_index = find_cursor_index(collection)
  return [] if cursor_index.blank?

  left, right = split_collection(collection, cursor_index)

  query_operator == :lt ? left : right
end
find_cursor_index(collection) click to toggle source
# File lib/cursor_paginator/paginator/array.rb, line 23
def find_cursor_index(collection)
  collection.index do |item|
    item.public_send(paginator_options.fetch(:primary_key)) == options_parser.cursor
  end
end
split_collection(collection, cursor_index) click to toggle source
# File lib/cursor_paginator/paginator/array.rb, line 29
def split_collection(collection, cursor_index)
  left, right = collection.partition.with_index { |_, i| i <= cursor_index }
  left.pop

  [left, right]
end