001package com.ericlam.mc.eld.configurations;
002
003
004import javax.annotation.Nullable;
005import java.nio.file.Path;
006import java.util.function.Predicate;
007
008/**
009 * 分頁請求
010 */
011public class PageRequest {
012
013    /**
014     * 特定數量的指定頁數請求
015     *
016     * @param page 頁數 (必須從 0 開始)
017     * @param size 數量
018     * @return 頁數請求
019     */
020    public static PageRequest of(int page, int size) {
021        return new PageRequest(page, size);
022    }
023
024
025    /**
026     * 特定數量特定排序的指定頁數請求
027     *
028     * @param page   頁數 (必須從 0 開始)
029     * @param size   數量
030     * @param filter 文件路徑過濾
031     * @return 頁數請求
032     */
033    public static PageRequest of(int page, int size, Predicate<Path> filter) {
034        return new PageRequest(page, size, filter);
035    }
036
037    private final int page;
038    private final int size;
039    private final Predicate<Path> filter;
040
041    /**
042     * 特定數量的指定頁數請求
043     *
044     * @param page 頁數 (必須從 0 開始)
045     * @param size 數量
046     */
047    public PageRequest(int page, int size) {
048        this(page, size, null);
049    }
050
051    /**
052     * 特定數量特定排序的指定頁數請求
053     *
054     * @param page   頁數 (必須從 0 開始)
055     * @param size   數量
056     * @param filter 文件路徑過濾
057     */
058    public PageRequest(int page, int size, @Nullable Predicate<Path> filter) {
059        this.page = page;
060        this.size = size;
061        this.filter = filter;
062    }
063
064    /**
065     * 獲取頁面請求的頁面數
066     *
067     * @return 頁面數
068     */
069    public int getPage() {
070        return page;
071    }
072
073    /**
074     * 獲取每頁數量
075     *
076     * @return 數量
077     */
078    public int getSize() {
079        return size;
080    }
081
082    /**
083     * 獲取路徑過濾
084     *
085     * @return 自定義過濾
086     */
087    @Nullable
088    public Predicate<Path> getFilter() {
089        return filter;
090    }
091
092    /**
093     * 獲取下一頁的頁面請求
094     *
095     * @return 頁面請求
096     */
097    public PageRequest next() {
098        return this.withPage(page + 1);
099    }
100
101    /**
102     * 獲取指定頁數的新頁面請求
103     *
104     * @param page 新頁數
105     * @return 頁面請求
106     */
107    public PageRequest withPage(int page) {
108        return PageRequest.of(page, size, filter);
109    }
110
111    /**
112     * 獲取上一頁或第一頁的頁面請求
113     *
114     * @return 頁面請求
115     */
116    public PageRequest previousOrFirst() {
117        return this.withPage(Math.max(0, page - 1));
118    }
119
120}