implement propose_extend!
let track_length() count in reverse
implement propose_reduce!()
implement propose_merge!()