@@ -4141,6 +4141,42 @@ test collapseRepeats {
4141
4141
try testCollapseRepeats ("//a///a////" , '/' , "/a/a/" );
4142
4142
}
4143
4143
4144
+ /// Collapse consecutive duplicates into one entry.
4145
+ ///
4146
+ /// See also `collapseRepeats`
4147
+ pub fn collapseRepeatsAll (comptime T : type , slice : []T ) []T {
4148
+ if (slice .len == 0 ) return slice ;
4149
+
4150
+ var write_index : usize = 1 ;
4151
+ for (slice [0 .. slice .len - 1 ], slice [1.. ]) | elem , next | {
4152
+ if (elem != next ) {
4153
+ slice [write_index ] = next ;
4154
+ write_index += 1 ;
4155
+ }
4156
+ }
4157
+ return slice [0.. write_index ];
4158
+ }
4159
+
4160
+ test collapseRepeatsAll {
4161
+ try std .testing .expectEqualSlices (u8 , &.{}, collapseRepeatsAll (u8 , &.{}));
4162
+ {
4163
+ var array : [1 ]u8 = .{0 };
4164
+ try std .testing .expectEqualSlices (u8 , &.{0 }, collapseRepeatsAll (u8 , & array ));
4165
+ }
4166
+ {
4167
+ var array : [2 ]u8 = .{ 0 , 0 };
4168
+ try std .testing .expectEqualSlices (u8 , &.{0 }, collapseRepeatsAll (u8 , & array ));
4169
+ }
4170
+ {
4171
+ var array : [2 ]u8 = .{ 0 , 1 };
4172
+ try std .testing .expectEqualSlices (u8 , &.{ 0 , 1 }, collapseRepeatsAll (u8 , & array ));
4173
+ }
4174
+ {
4175
+ var array : [10 ]u8 = .{ 1 , 0 , 1 , 1 , 10 , 10 , 10 , 0 , 0 , 0 };
4176
+ try std .testing .expectEqualSlices (u8 , &.{ 1 , 0 , 1 , 10 , 0 }, collapseRepeatsAll (u8 , & array ));
4177
+ }
4178
+ }
4179
+
4144
4180
/// Calculate the size needed in an output buffer to perform a replacement.
4145
4181
/// The needle must not be empty.
4146
4182
pub fn replacementSize (comptime T : type , input : []const T , needle : []const T , replacement : []const T ) usize {
0 commit comments