about summary refs log tree commit diff
path: root/IRCTokens/EnumerableExtensions.cs
diff options
context:
space:
mode:
Diffstat (limited to 'IRCTokens/EnumerableExtensions.cs')
-rw-r--r--IRCTokens/EnumerableExtensions.cs62
1 files changed, 62 insertions, 0 deletions
diff --git a/IRCTokens/EnumerableExtensions.cs b/IRCTokens/EnumerableExtensions.cs
new file mode 100644
index 0000000..f98a86d
--- /dev/null
+++ b/IRCTokens/EnumerableExtensions.cs
@@ -0,0 +1,62 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace IRCTokens
+{
+    public static class EnumerableExtensions
+    {
+        public static IEnumerable<byte[]> Split(this byte[] bytes, byte separator)
+        {
+            if (bytes == null || bytes.Length == 0) return new List<byte[]>();
+
+            var newLineIndices = bytes.Select((b, i) => b == separator ? i : -1).Where(i => i != -1).ToArray();
+            var lines          = new byte[newLineIndices.Length + 1][];
+            var currentIndex   = 0;
+            var arrIndex       = 0;
+
+            for (var i = 0; i < newLineIndices.Length && currentIndex < bytes.Length; ++i)
+            {
+                var n = new byte[newLineIndices[i] - currentIndex];
+                Array.Copy(bytes, currentIndex, n, 0, newLineIndices[i] - currentIndex);
+                currentIndex      = newLineIndices[i] + 1;
+                lines[arrIndex++] = n;
+            }
+
+            // Handle the last string at the end of the array if there is one.
+            if (currentIndex < bytes.Length)
+                lines[arrIndex] = bytes.Skip(currentIndex).ToArray();
+            else if (arrIndex == newLineIndices.Length)
+                // We had a separator character at the end of a string.  Rather than just allowing
+                // a null character, we'll replace the last element in the array with an empty string.
+                lines[arrIndex] = Array.Empty<byte>();
+
+            return lines.ToArray();
+        }
+
+        public static byte[] Trim(this IEnumerable<byte> bytes, byte separator)
+        {
+            if (bytes == null) return Array.Empty<byte>();
+
+            var byteList = new List<byte>(bytes);
+            var i        = 0;
+
+            if (!byteList.Any()) return byteList.ToArray();
+
+            while (byteList[i] == separator)
+            {
+                byteList.RemoveAt(i);
+                i++;
+            }
+
+            i = byteList.Count - 1;
+            while (byteList[i] == separator)
+            {
+                byteList.RemoveAt(i);
+                i--;
+            }
+
+            return byteList.ToArray();
+        }
+    }
+}