Skip to content

Instantly share code, notes, and snippets.

@soegaard
Created March 25, 2013 11:58
Show Gist options
  • Save soegaard/5236660 to your computer and use it in GitHub Desktop.
Save soegaard/5236660 to your computer and use it in GitHub Desktop.
#lang racket
(require racket/control)
(define (make-fringe-getter tree)
(λ ()
(let loop ([tree tree])
(match tree
[(cons a d) (loop a)
(loop d)]
['() (void)]
[else (fcontrol tree)]))
(fcontrol 'done)))
(define (same-fringe? tree1 tree2)
(let loop ([get-fringe1 (make-fringe-getter tree1)]
[get-fringe2 (make-fringe-getter tree2)])
(% (get-fringe1)
(λ (fringe1 get-fringe1)
(% (get-fringe2)
(λ (fringe2 get-fringe2)
(and (equal? fringe1 fringe2)
(or (eq? fringe1 'done)
(loop get-fringe1 get-fringe2)))))))))
;; unit tests
(require rackunit)
(check-true (same-fringe? '((1 2 3) ((4 5 6) (7 8)))
'(((1 2 3) (4 5 6)) (7 8))))
(check-false (same-fringe? '((1 2 3) ((4 5 6) (7 8)))
'(((1 2 3) (4 6)) (8))))
(check-false (same-fringe? '((1 2 3) ((4 5 6) (7)))
'(((1 2 3) (4 5 6)) (7 8))))
(check-false (same-fringe? '(((1 2 3) (4 5 6)) (7 8))
'((1 2 3) ((4 5 6) (7)))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment