I implemented it for fun and noticed that in your test data, the first 16 is gone. So, groupings are wrong with all methods proposed in a sense.
With Richard's version, we get this in Pharo
#(16 17 17 16 18 17 18 19 19 19 18 19 19 20 19 20 19 20 20 20 19 20) ��splitEvery: 7
"an OrderedCollection(#(16 17 17 16 18 17 18) #(19 19 19 18 19 19 20) #(19 20 19 20 20 20 19) #(20))"
splitEvery: chunkSize
��"Answer a collection of sub-collections each of the specified chunk size.
�� If the receiver size is not a multiple of chunkSize, the last sub-collection will be shorter."
��
��| chunks stream |
��chunkSize < 1 ifTrue: [ ^self splitEvery: 1 ].
��
��stream := ReadStream on: self.
��chunks := OrderedCollection new.
��[stream atEnd] whileFalse: [
�� chunks add: (stream next: chunkSize).
��].
��
��^chunks.
Phil