merge-se added by megane on Tue Jul 17 15:08:43 2018
(define (merge-se . ses*) ; later occurrences take precedence to earlier ones
(let ([table (make-hash-table)]
[rses (reverse ses*)])
(let loop ([ses (cdr rses)]
[last-se (car rses)]
[se2 (car rses)])
(cond
[(null? ses) se2]
[(eq? last-se (car ses))
;;(print "shortcut!")
(loop (cdr ses) last-se se2)]
[else
(let lp ([se (car ses)]
[se2 se2])
(cond
[(null? se) (loop (cdr ses) (car ses) se2)]
[(hash-table-exists? table (caar se))
(lp (cdr se) se2)]
[else
(hash-table-set! table (caar se) #t)
(lp (cdr se) (cons (car se) se2))]))]))))