WIP
This commit is contained in:
		
							
								
								
									
										112
									
								
								AuroraSignal/Src/Cursor/Cursor.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								AuroraSignal/Src/Cursor/Cursor.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,112 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
|  | ||||
| #nullable enable | ||||
| namespace Aurora.Cursor | ||||
| { | ||||
|     public enum SortDirection | ||||
|     { | ||||
|         Asc, | ||||
|         Desc, | ||||
|     } | ||||
|  | ||||
|     public class Cursor<T> where T : ICursorObject | ||||
|     { | ||||
|         private CursorList<T> _list; | ||||
|  | ||||
|         private string? _previousPageToken; | ||||
|         private string? _nextPageToken; | ||||
|         private int _pageSize; | ||||
|         private Func<KeyValuePair<string, T>, string> _sortDelgate; | ||||
|         private SortDirection _direction; | ||||
|         public Cursor(ref CursorList<T> list) | ||||
|         { | ||||
|             this._list = list; | ||||
|             this._previousPageToken = string.Empty; | ||||
|             this._nextPageToken = string.Empty; | ||||
|             this._pageSize = 10; | ||||
|             this._sortDelgate = delegate (KeyValuePair<string, T> item) | ||||
|             { | ||||
|                 return item.Value.Id; | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         public CursorResult<T> GetNextPage() | ||||
|         { | ||||
|             List<KeyValuePair<string, T>> tmpList; | ||||
|  | ||||
|             // Sort reference list | ||||
|             if (this._direction == SortDirection.Desc) | ||||
|             { | ||||
|                 tmpList = this._list.OrderByDescending(this._sortDelgate).ToList(); | ||||
|  | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 tmpList = this._list.OrderBy(this._sortDelgate).ToList(); | ||||
|             } | ||||
|  | ||||
|             if (tmpList == null) | ||||
|             { | ||||
|                 throw new System.NullReferenceException(); | ||||
|             } | ||||
|  | ||||
|             int startIdx = 0; | ||||
|             if (!string.IsNullOrEmpty(this._nextPageToken)) | ||||
|             { | ||||
|                 // TODO find another way to index into the list that's not a regular array search | ||||
|                 startIdx = tmpList.FindIndex(item => item.Key == this._nextPageToken); | ||||
|             } | ||||
|  | ||||
|             int endIdx = startIdx + this._pageSize; | ||||
|  | ||||
|             List<T> selection = new List<T>(); | ||||
|  | ||||
|             // Get page | ||||
|             for (int i = startIdx; i < tmpList.Count && i < endIdx; i++) | ||||
|             { | ||||
|                 selection.Add(tmpList.ElementAt(i).Value); | ||||
|             } | ||||
|  | ||||
|             return new CursorResult<T> | ||||
|             { | ||||
|                 NextPageToken = selection[selection.Count - 1].Id, | ||||
|                 PrevPageToken = selection[0].Id, | ||||
|                 Count = this._list.Count, | ||||
|                 Result = selection | ||||
|             }; | ||||
|         } | ||||
|  | ||||
|         public CursorResult<T> GetPreviousPage() | ||||
|         { | ||||
|             throw new NotImplementedException(); | ||||
|         } | ||||
|  | ||||
|         public Cursor<T> WithNextPage(string nextPageToken) | ||||
|         { | ||||
|             this._nextPageToken = nextPageToken; | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         public Cursor<T> WithPreviousPage(string prevPageToken) | ||||
|         { | ||||
|             this._previousPageToken = prevPageToken; | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         public Cursor<T> WithSort(Func<KeyValuePair<string, T>, string> sortDelegate, SortDirection direction) | ||||
|         { | ||||
|             this._sortDelgate = sortDelegate; | ||||
|             this._direction = direction; | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|         public Cursor<T> WithSize(int size) | ||||
|         { | ||||
|             this._pageSize = size; | ||||
|             return this; | ||||
|         } | ||||
|     } | ||||
|  | ||||
| } | ||||
							
								
								
									
										32
									
								
								AuroraSignal/Src/Cursor/CursorList.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								AuroraSignal/Src/Cursor/CursorList.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.Collections; | ||||
| using System; | ||||
| using System.Linq; | ||||
| using Aurora.Utils; | ||||
|  | ||||
| #nullable enable | ||||
| namespace Aurora.Cursor | ||||
| { | ||||
|  | ||||
|     public class CursorList<T> : SortedList<string, T> where T : ICursorObject | ||||
|     { | ||||
|  | ||||
|         public CursorList() | ||||
|         { | ||||
|         } | ||||
|  | ||||
|         public CursorList<T> Add(T item) | ||||
|         { | ||||
|             string itemHashId = HashUtil.GetHash(new string[] { item.Id, item.GetHashCode().ToString() }).ToString(); | ||||
|             bool res = this.TryAdd(itemHashId, item); | ||||
|  | ||||
|             if (res == false) | ||||
|             { | ||||
|                 throw new System.Exception("Failed to add item to cursor list"); | ||||
|             } | ||||
|             return this; | ||||
|         } | ||||
|  | ||||
|  | ||||
|     } | ||||
| } | ||||
							
								
								
									
										9
									
								
								AuroraSignal/Src/Cursor/CursorObject.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								AuroraSignal/Src/Cursor/CursorObject.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace Aurora.Cursor | ||||
| { | ||||
|     public interface ICursorObject | ||||
|     { | ||||
|         string Id { get; set; } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										25
									
								
								AuroraSignal/Src/Cursor/CursorResult.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								AuroraSignal/Src/Cursor/CursorResult.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| using System.Collections.Generic; | ||||
|  | ||||
| namespace Aurora.Cursor | ||||
| { | ||||
|     public class CursorResult<T> | ||||
|     { | ||||
|         public CursorResult() | ||||
|         { | ||||
|             Result = new List<T>(); | ||||
|         } | ||||
|  | ||||
|         public CursorResult(CursorResult<T> cpy) | ||||
|         { | ||||
|             NextPageToken = cpy.NextPageToken; | ||||
|             PrevPageToken = cpy.PrevPageToken; | ||||
|             Result = cpy.Result; | ||||
|             Count = cpy.Count; | ||||
|         } | ||||
|  | ||||
|         public string NextPageToken { get; set; } | ||||
|         public string PrevPageToken { get; set; } | ||||
|         public List<T> Result { get; set; } | ||||
|         public int Count { get; set; } | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user