#!/usr/local/bin/cz --
use b

Main()
	int max_int = 100
	int n_ints = 30
	new(q, priq, int, n_ints+1)
	for(c, 0, n_ints)
		int v = randi(0, max_int)
		priq_push(q, int, int_cmp_macro, &v)
		if toss()
			priq_shift(q, int, int_cmp_macro)
	priq_check(q, int_cmp_macro)

	decl(q2, vec)
	vec_dup(q2, q)
	int from = randi(0, priq_get_size(q2))
	int i = from
	int v0 = *(int *)priq_element(q, i)
	int v = randi(0, max_int)
	*(int *)priq_element(q2, i) = v
	priq_repos(q2, int, int_cmp_macro, i, move_notify, (void*)1)

	priq_check(q2, int_cmp_macro)

	nl()
	dump_heap(q)
	dumpout(q)
	nl()
	Sayf("q[%d] was %d := %d", from, v0, v)
	nl()
	dump_heap(q2)
	dumpout(q2)
	nl()

def dump_heap(q)
	Print("[")
	for_vec(my(i), q, int)
		Printf("%d", *my(i))
		if my(i) != vec_get_end(q)
			spc()
	Print("\b]")
	nl()

def dumpout(q)
	while !priq_empty(q)
		Printf("%d ", *(int *)priq_peek(q))
		priq_shift(q, int, int_cmp_macro)
	nl()

def int_cmp_macro(a, b) *(int*)a - *(int*)b

def move_notify(q, to, from, arg)
	Sayf("move_notify %d <- %d", to, from)
