11using System ;
2+ using System . Collections ;
23using System . Collections . Generic ;
34using System . Diagnostics . CodeAnalysis ;
45using System . Linq ;
56
67namespace Sharprompt . Internal ;
78
8- internal class Paginator < T > where T : notnull
9+ internal class Paginator < T > : IEnumerable < T > where T : notnull
910{
1011 public Paginator ( IEnumerable < T > items , int pageSize , Optional < T > defaultValue , Func < T , string > textSelector )
1112 {
@@ -20,37 +21,38 @@ public Paginator(IEnumerable<T> items, int pageSize, Optional<T> defaultValue, F
2021 private readonly int _pageSize ;
2122 private readonly Func < T , string > _textSelector ;
2223
24+ private T [ ] _filteredItems = Array . Empty < T > ( ) ;
2325 private int _selectedIndex = - 1 ;
2426
25- public T [ ] FilteredItems { get ; private set ; } = Array . Empty < T > ( ) ;
27+ public ReadOnlySpan < T > CurrentItems => new ( _filteredItems , _pageSize * CurrentPage , Count ) ;
2628
2729 public int PageCount { get ; private set ; }
2830
29- public int SelectedPage { get ; private set ; }
31+ public int CurrentPage { get ; private set ; }
3032
31- public int Count => Math . Min ( FilteredItems . Length - ( _pageSize * SelectedPage ) , _pageSize ) ;
33+ public int Count => Math . Min ( _filteredItems . Length - ( _pageSize * CurrentPage ) , _pageSize ) ;
3234
33- public int TotalCount => FilteredItems . Length ;
35+ public int TotalCount => _filteredItems . Length ;
3436
35- public string FilterTerm { get ; private set ; } = "" ;
37+ public string FilterKeyword { get ; private set ; } = "" ;
3638
3739 public bool TryGetSelectedItem ( [ NotNullWhen ( true ) ] out T ? selectedItem )
3840 {
39- if ( FilteredItems . Length == 1 )
41+ if ( _filteredItems . Length == 1 )
4042 {
41- selectedItem = FilteredItems [ 0 ] ;
43+ selectedItem = _filteredItems [ 0 ] ;
4244
4345 return true ;
4446 }
4547
46- if ( _selectedIndex == - 1 || FilteredItems . Length == 0 )
48+ if ( _selectedIndex == - 1 || _filteredItems . Length == 0 )
4749 {
4850 selectedItem = default ;
4951
5052 return false ;
5153 }
5254
53- selectedItem = FilteredItems [ ( _pageSize * SelectedPage ) + _selectedIndex ] ;
55+ selectedItem = _filteredItems [ ( _pageSize * CurrentPage ) + _selectedIndex ] ;
5456
5557 return true ;
5658 }
@@ -72,8 +74,8 @@ public void NextPage()
7274 return ;
7375 }
7476
75- SelectedPage = SelectedPage >= PageCount - 1 ? 0 : SelectedPage + 1 ;
7677 _selectedIndex = - 1 ;
78+ CurrentPage = CurrentPage >= PageCount - 1 ? 0 : CurrentPage + 1 ;
7779 }
7880
7981 public void PreviousPage ( )
@@ -83,45 +85,47 @@ public void PreviousPage()
8385 return ;
8486 }
8587
86- SelectedPage = SelectedPage <= 0 ? PageCount - 1 : SelectedPage - 1 ;
8788 _selectedIndex = - 1 ;
89+ CurrentPage = CurrentPage <= 0 ? PageCount - 1 : CurrentPage - 1 ;
8890 }
8991
90- public void UpdateFilter ( string term )
92+ public void UpdateFilter ( string keyword )
9193 {
92- FilterTerm = term ;
94+ FilterKeyword = keyword ;
9395
9496 _selectedIndex = - 1 ;
95- SelectedPage = 0 ;
97+ CurrentPage = 0 ;
9698
97- UpdateItems ( ) ;
99+ UpdateFilteredItems ( ) ;
98100 }
99101
100- public ArraySegment < T > ToSubset ( ) => new ( FilteredItems , _pageSize * SelectedPage , Count ) ;
102+ public IEnumerator < T > GetEnumerator ( ) => ( IEnumerator < T > ) _filteredItems . GetEnumerator ( ) ;
101103
102- private void UpdateItems ( )
104+ IEnumerator IEnumerable . GetEnumerator ( ) => GetEnumerator ( ) ;
105+
106+ private void UpdateFilteredItems ( )
103107 {
104- FilteredItems = _items . Where ( x => _textSelector ( x ) . IndexOf ( FilterTerm , StringComparison . OrdinalIgnoreCase ) != - 1 )
105- . ToArray ( ) ;
108+ _filteredItems = _items . Where ( x => _textSelector ( x ) . IndexOf ( FilterKeyword , StringComparison . OrdinalIgnoreCase ) != - 1 )
109+ . ToArray ( ) ;
106110
107- PageCount = ( FilteredItems . Length - 1 ) / _pageSize + 1 ;
111+ PageCount = ( _filteredItems . Length - 1 ) / _pageSize + 1 ;
108112 }
109113
110114 private void InitializeDefaults ( Optional < T > defaultValue )
111115 {
112- UpdateItems ( ) ;
116+ UpdateFilteredItems ( ) ;
113117
114118 if ( ! defaultValue . HasValue )
115119 {
116120 return ;
117121 }
118122
119- for ( var i = 0 ; i < FilteredItems . Length ; i ++ )
123+ for ( var i = 0 ; i < _filteredItems . Length ; i ++ )
120124 {
121- if ( EqualityComparer < T > . Default . Equals ( FilteredItems [ i ] , defaultValue ) )
125+ if ( EqualityComparer < T > . Default . Equals ( _filteredItems [ i ] , defaultValue ) )
122126 {
123127 _selectedIndex = i % _pageSize ;
124- SelectedPage = i / _pageSize ;
128+ CurrentPage = i / _pageSize ;
125129
126130 break ;
127131 }
0 commit comments