using InnovEnergy.Lib.Utils; namespace InnovEnergy.Lib.Protocols.Modbus.Util; public static class ArraySegmentExtensions { public static ArraySegment ToArraySegment(this IEnumerable enumerable) => enumerable switch { ArraySegment ars => ars, IReadOnlyList rol => rol.ToArray(), _ => enumerable.ToArray() }; public static ArraySegment Skip(this ArraySegment seg, Int32 count) { var skip = Math.Min(count, seg.Count); var take = seg.Count - skip; return new ArraySegment(seg.Array!,seg.Offset+skip, take); } public static ArraySegment Take(this ArraySegment seg, Int32 count) { var take = Math.Min(count, seg.Count); return new ArraySegment(seg.Array!, seg.Offset, take); } public static ArraySegment SkipLast(this ArraySegment seg, Int32 count) { var take = Math.Max(seg.Count - count, 0); return new ArraySegment(seg.Array!, seg.Offset, take); } public static ArraySegment SkipWhile(this ArraySegment seg, Func predicate) { var skip = Enumerable.TakeWhile(seg, predicate).Count(); var take = seg.Count - skip; return new ArraySegment(seg.Array!, seg.Offset, take); } public static ArraySegment TakeWhile(this ArraySegment seg, Func predicate) { var take = Enumerable.TakeWhile(seg, predicate).Count(); return new ArraySegment(seg.Array!, seg.Offset, take); } public static ArraySegment TakeLast(this ArraySegment seg, Int32 count) { var skip = Math.Max(seg.Count - count, 0); var take = seg.Count - skip; return new ArraySegment(seg.Array!, seg.Offset+skip, take); } }