: build-lookup ( seq -- hashtable ) H{ } [ set-of ] reduce-index ; : build-pairs ( sum seq -- pairs ) [ [ - ] keep 2array ] with map! ; : lookup ( hashtable pairs -- index/f ) first2 [ of ] bi-curry@ bi and ; : find-sum ( hashtable seq -- sum ) [ lookup ] with map! sift ; : two-sum ( sum seq -- pair ) [ nip build-lookup ] [ build-pairs ] 2bi find-sum ;