;; MODULE-USE-INTERFACES! module interfaces
;;
-;; Same as MODULE-USE! but add multiple interfaces and check for duplicates
+;; Same as MODULE-USE!, but only notifies module observers after all
+;; interfaces are added to the inports list.
;;
(define (module-use-interfaces! module interfaces)
- (let ((prev (filter (lambda (used)
- (and-map (lambda (iface)
- (not (eq? used iface)))
- interfaces))
- (module-uses module))))
- (set-module-uses! module
- (append prev interfaces))
+ (let* ((cur (module-uses module))
+ (new (let lp ((in interfaces) (out '()))
+ (if (null? in)
+ (reverse out)
+ (lp (cdr in)
+ (let ((iface (car in)))
+ (if (or (memq iface cur) (memq iface out))
+ out
+ (cons iface out))))))))
+ (set-module-uses! module (append cur new))
(hash-clear! (module-import-obarray module))
(module-modified module)))
\f
+;;;
+;;; module-use! / module-use-interfaces!
+;;;
+(with-test-prefix "module-use"
+ (let ((m (make-module)))
+ (pass-if "no uses initially"
+ (null? (module-uses m)))
+
+ (pass-if "using ice-9 q"
+ (begin
+ (module-use! m (resolve-interface '(ice-9 q)))
+ (equal? (module-uses m)
+ (list (resolve-interface '(ice-9 q))))))
+
+ (pass-if "using ice-9 q again"
+ (begin
+ (module-use! m (resolve-interface '(ice-9 q)))
+ (equal? (module-uses m)
+ (list (resolve-interface '(ice-9 q))))))
+
+ (pass-if "using ice-9 ftw"
+ (begin
+ (module-use-interfaces! m (list (resolve-interface '(ice-9 ftw))))
+ (equal? (module-uses m)
+ (list (resolve-interface '(ice-9 q))
+ (resolve-interface '(ice-9 ftw))))))
+
+ (pass-if "using ice-9 ftw again"
+ (begin
+ (module-use-interfaces! m (list (resolve-interface '(ice-9 ftw))))
+ (equal? (module-uses m)
+ (list (resolve-interface '(ice-9 q))
+ (resolve-interface '(ice-9 ftw))))))
+
+ (pass-if "using ice-9 control twice"
+ (begin
+ (module-use-interfaces! m (list (resolve-interface '(ice-9 control))
+ (resolve-interface '(ice-9 control))))
+ (equal? (module-uses m)
+ (list (resolve-interface '(ice-9 q))
+ (resolve-interface '(ice-9 ftw))
+ (resolve-interface '(ice-9 control))))))))
+
+
+\f
;;;
;;; Resolve-module.
;;;