Page.java

package com.github.jenkaby.bikerental.shared.domain.model.vo;

import org.jspecify.annotations.NonNull;

import java.util.List;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;


public record Page<T>(List<T> items, long totalItems, PageRequest pageRequest) {

    public Page(List<T> items, long totalItems, PageRequest pageRequest) {
        this.items = List.copyOf(items);
        this.totalItems = totalItems;
        this.pageRequest = pageRequest;
    }

    public int totalPages() {
        return (int) Math.ceil((double) totalItems / pageRequest.limit());
    }

    public <U> Page<U> map(@NonNull Function<? super T, ? extends U> mapper) {
        Objects.requireNonNull(mapper, "Mapper function must not be null");
        return new Page<>(getConvertedContent(mapper), totalItems, pageRequest);
    }

    private <U> List<U> getConvertedContent(Function<? super T, ? extends U> converter) {
        return this.items.stream().map(converter).collect(Collectors.toList());
    }

    public static <S> Page<S> empty(PageRequest pageRequest) {
        return new Page<S>(List.<S>of(), 0, pageRequest);
    }

    public static <T> Page<?> of(@NonNull T item, PageRequest pageRequest) {
        return new Page<>(List.of(item), 1, pageRequest);
    }
}