public static Connection <TSource> ToConnection <TSource, TParent>( IEnumerable <TSource> slice, IResolveConnectionContext <TParent> context, int sliceStartIndex, int totalCount, bool strictCheck = true ) { var sliceList = slice as IList <TSource> ?? slice.ToList(); var metrics = ArraySliceMetrics.Create( sliceList, context, sliceStartIndex, totalCount, strictCheck ); var edges = metrics.Slice.Select((item, i) => new Edge <TSource> { Node = item, Cursor = OffsetToCursor(metrics.StartOffset + i) }) .ToList(); var firstEdge = edges.FirstOrDefault(); var lastEdge = edges.LastOrDefault(); return(new Connection <TSource> { Edges = edges, TotalCount = totalCount, PageInfo = new PageInfo { StartCursor = firstEdge?.Cursor, EndCursor = lastEdge?.Cursor, HasPreviousPage = metrics.HasPrevious, HasNextPage = metrics.HasNext, } }); }