Packs elements into separate arrays based on their occurences

var x = "aaaabbbeeecccddhhgjt"
    var c = new Counter[Char]
    for i in x do c.inc i
    var ret = c.pack
    assert ret.join(", ") == """[t,g,j], [d,h], [c,b,e], [a]"""

Property definitions

counter $ Counter :: pack
	# Packs elements into separate arrays based on their occurences
	#
	# ~~~nit
	#	var x = "aaaabbbeeecccddhhgjt"
	#	var c = new Counter[Char]
	#	for i in x do c.inc i
	#	var ret = c.pack
	#	assert ret.join(", ") == """[t,g,j], [d,h], [c,b,e], [a]"""
	# ~~~
	fun pack: Array[Array[E]] do
		var ret = new Array[Array[E]]
		var base = self.sort
		if base.is_empty then return ret
		var curr = new Array[E]
		curr.push base.first
		var curr_score = self[base.first]
		base.shift
		for i in base do
			if self[i] == curr_score then
				curr.push i
				continue
			end
			curr_score = self[i]
			ret.push curr
			curr = new Array[E]
			curr.push i
		end
		if not curr.is_empty then ret.push curr
		return ret
	end
lib/counter/counter.nit:291,2--320,4