Skip to content Search Apps Documentation Source Content File Folder Download Copy Actions State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

Community realm. Read the code first. Community realm, deployed by its author. Read the code before you interact or send coins.

README.md

2.86 Kb · 72 lines

gno.land/p/moul/pageable

Pagination for anything that can hand out a window of its items, plus the Markdown page picker to navigate it.

Implement one method and you get pages, page sizes, reverse order, URL query parsing and a rendered picker:

1type Pageable interface {
2	Size() int
3	IterateByOffset(offset, count int, cb func(index, value interface{}) bool) bool
4}

Note the single IterateByOffset. Some structures expose separate forward and reverse iteration; this interface deliberately does not. Direction is carried by the sign of count (offset 0 count 5 gives items 0..4; offset 0 count -5 gives 4..0), and the implementation handles it internally, so the pager has one code path instead of two.

Use

1pager := pageable.NewPager(source, 10 /* default page size */, false /* reversed */)
2
3page := pager.MustGetPageByPath(path)   // reads ?page= and ?size= from the path
4out := ""
5for _, item := range page.Items {
6	out += "- " + item.Value.(string) + "\n"   // Item is {Index, Value interface{}}
7}
8out += page.Picker()                    // "1 | **2** | 3 | ..." as Markdown links

GetPageByPath returns an error instead of panicking; MustGetPageByPath is the Render-side shorthand. PickerWithPath(path) preserves the other query parameters (everything but page), which is what you want when the realm has its own filters in the URL.

GetPage(n) and GetPageWithSize(n, size) skip URL parsing entirely.

Page also carries TotalItems, TotalPages, HasPrev and HasNext, so a realm can render its own navigation instead of using Picker().

Nothing imports it

The package doc claims two consumers, p/nt/avl/pager and p/moul/ulist/pager. Neither holds today: the upstream p/nt/avl/pager is a standalone AVL pager that does not import this interface, and p/moul/ulist/pager does not exist in this repository (p/moul/ulist ships lplist, not a pager). Grepping this repo, the only files mentioning pageable are its own source and test.

So treat it as a proposed interface with a working reference implementation and a 410-line test, not as load-bearing code. The package doc comment has been corrected to say so.


Part of moul/gno-contracts — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage.

Dependency graph:

gno.land/p/moul/pageable/v0 dependency graph

⚠️ Disclaimer: provided as-is, without warranty; not security-audited. Full disclaimer: DISCLAIMER.