: (greater) ( keyl l keyi i -- keyl/keyi l/i ) [ pick over after=? ] dip swap [ 2drop ] [ [ 2drop ] 2dip ] if ; : greater ( key l i heap -- key l/i ) 2dup length < [ dupd nth swap (greater) ] [ 2drop ] if ; : greatest ( key i heap -- key l/r/p ) [ over left swap greater ] 2keep [ right ] dip greater ; : exchange-keys ( keyi i keyl l heap -- keyi l heap ) [ rot swapd ] dip [ set-nth ] keep ; : (heapify) ( key i heap -- ) [ ] [ greatest ] [ drop nip dupd = ] 3tri [ 2drop set-nth ] [ rot exchange-keys (heapify) ] if ; : heapify ( i heap -- ) [ nth ] 2keep (heapify) ;