@@ -825,3 +825,88 @@ test "group_by with complex objects" {
825
825
let groups = grouped .values ().map (fn (a ) { a .map (fn (p ) { p .name }) }).collect ()
826
826
assert_eq! (groups , [["Alice" , "Bob" ], ["Charlie" , "Eve" ], ["Dave" ]])
827
827
}
828
+
829
+ ///|
830
+ test "chunk_by with consecutive identical elements" {
831
+ let iter = [1 , 1 , 2 , 2 , 3 , 3 ].iter ()
832
+ let chunked = iter .chunk_by (fn (x ) { x })
833
+ let result = chunked .map (fn (g ) { (g .0 , g .1 .collect ()) }).collect ()
834
+ assert_eq! (result , [(1 , [1 , 1 ]), (2 , [2 , 2 ]), (3 , [3 , 3 ])])
835
+ }
836
+
837
+ ///|
838
+ test "chunk_by with non-consecutive identical elements" {
839
+ let iter = [1 , 2 , 1 , 3 , 2 , 1 ].iter ()
840
+ let chunked = iter .chunk_by (fn (x ) { x })
841
+ let result = chunked .map (fn (g ) { (g .0 , g .1 .collect ()) }).collect ()
842
+ assert_eq! (result , [
843
+ (1 , [1 ]),
844
+ (2 , [2 ]),
845
+ (1 , [1 ]),
846
+ (3 , [3 ]),
847
+ (2 , [2 ]),
848
+ (1 , [1 ]),
849
+ ])
850
+ }
851
+
852
+ ///|
853
+ test "chunk_by with empty input" {
854
+ let iter = Iter ::empty ()
855
+ let chunked = iter .chunk_by (fn (x ) { x })
856
+ let result = chunked .map (fn (g ) { (g .0 , g .1 .collect ()) }).collect ()
857
+ assert_eq! (result , [])
858
+ }
859
+
860
+ ///|
861
+ test "chunk_by with single element input" {
862
+ let iter = [42 ].iter ()
863
+ let chunked = iter .chunk_by (fn (x ) { x })
864
+ let result = chunked .map (fn (g ) { (g .0 , g .1 .collect ()) }).collect ()
865
+ assert_eq! (result , [(42 , [42 ])])
866
+ }
867
+
868
+ ///|
869
+ test "chunk_by with custom key function" {
870
+ let iter = [1 , 2 , 3 , 4 ].iter ()
871
+ let chunked = iter .chunk_by (fn (x ) { x % 2 })
872
+ let result = chunked .map (fn (g ) { (g .0 , g .1 .collect ()) }).collect ()
873
+ assert_eq! (result , [(1 , [1 ]), (0 , [2 ]), (1 , [3 ]), (0 , [4 ])])
874
+ }
875
+
876
+ ///|
877
+ test "chunk_by with strings" {
878
+ let iter = ["apple" , "avocado" , "banana" , "cherry" , "blueberry" ].iter ()
879
+ let chunked = iter .chunk_by (fn (s ) { s [0 ] })
880
+ let result = chunked .map (fn (g ) { (g .0 , g .1 .collect ()) }).collect ()
881
+ assert_eq! (result , [
882
+ ('a' , ["apple" , "avocado" ]),
883
+ ('b' , ["banana" ]),
884
+ ('c' , ["cherry" ]),
885
+ ('b' , ["blueberry" ]),
886
+ ])
887
+ }
888
+
889
+ ///|
890
+ test "chunk_by with complex objects" {
891
+ struct Person {
892
+ name : String
893
+ age : Int
894
+ } derive (Show )
895
+ let people = [
896
+ Person ::{ name : "Alice" , age : 25 },
897
+ Person ::{ name : "Bob" , age : 25 },
898
+ Person ::{ name : "Charlie" , age : 30 },
899
+ Person ::{ name : "Dave" , age : 35 },
900
+ Person ::{ name : "Eve" , age : 30 },
901
+ ].iter ()
902
+ let chunked = people .chunk_by (fn (p ) { p .age })
903
+ let groups = chunked
904
+ .map (fn (g ) { (g .0 , g .1 .map (fn (p ) { p .name }).collect ()) })
905
+ .collect ()
906
+ assert_eq! (groups , [
907
+ (25 , ["Alice" , "Bob" ]),
908
+ (30 , ["Charlie" ]),
909
+ (35 , ["Dave" ]),
910
+ (30 , ["Eve" ]),
911
+ ])
912
+ }
0 commit comments