You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
#lang racket/base
|
|
|
|
(require "define/contract.rkt")
|
|
|
|
|
|
|
|
(module+ test (require rackunit))
|
|
|
|
|
|
|
|
(define+provide/contract (filter-tree proc tree)
|
|
|
|
(procedure? list? . -> . list?)
|
|
|
|
(define (remove-empty x)
|
|
|
|
(cond
|
|
|
|
[(list? x) (filter (compose1 not null?) (map remove-empty x))]
|
|
|
|
[else x]))
|
|
|
|
|
|
|
|
(define (filter-tree-inner proc x)
|
|
|
|
(cond
|
|
|
|
[(list? x) (map (λ(i) (filter-tree-inner proc i)) x)]
|
|
|
|
[else (if (proc x) x null)]))
|
|
|
|
|
|
|
|
(remove-empty (filter-tree-inner proc tree)))
|
|
|
|
|
|
|
|
|
|
|
|
(define+provide/contract (filter-not-tree proc tree)
|
|
|
|
(procedure? list? . -> . list?)
|
|
|
|
(filter-tree (λ(i) (not (proc i))) tree))
|
|
|
|
|
|
|
|
|
|
|
|
(define+provide/contract (map-tree proc tree)
|
|
|
|
(procedure? list? . -> . list?)
|
|
|
|
(cond
|
|
|
|
[(list? tree) (map (λ(i) (map-tree proc i)) tree)]
|
|
|
|
[else (proc tree)]))
|
|
|
|
|