]> git.donarmstrong.com Git - lilypond.git/commitdiff
Define and use event-class-cons
authorDavid Kastrup <dak@gnu.org>
Wed, 18 Apr 2012 05:29:52 +0000 (07:29 +0200)
committerDavid Kastrup <dak@gnu.org>
Wed, 2 May 2012 02:31:13 +0000 (04:31 +0200)
scm/define-event-classes.scm

index 771513f5b4f9815fe94096edd20d2c0111115645..f5a6cea5f01603f28080b606eef64c55079ef4cc 100644 (file)
     (Announcement . (AnnounceNewContext))
     ))
 
+(define-public (event-class-cons class parent classlist)
+  (let ((lineage (assq parent classlist)))
+    (if (not lineage)
+       (begin
+         (if (not (null? parent))
+             (ly:warning (_ "unknown parent class `~a'") parent))
+         (set! lineage '())))
+    (if (symbol? class)
+       (acons class lineage classlist)
+       (fold (lambda (elt alist)
+               (acons elt lineage alist))
+             classlist class))))
+
+(define all-event-classes
+  (fold (lambda (elt classlist)
+         (event-class-cons (cdr elt) (car elt) classlist))
+       '() event-classes))
+
 ;; Maps event-class to a list of ancestors (inclusive)
-(define ancestor-lookup (make-hash-table 11))
+(define-public ancestor-lookup
+  (let ((h (make-hash-table (length all-event-classes))))
+    (for-each (lambda (ent) (hashq-set! h (car ent) ent))
+             all-event-classes)
+    h))
+
 
 ;; Each class will be defined as
 ;; (class parent grandparent .. )
 ;; so that (eq? (cdr class) parent) holds.
-(for-each
- (lambda (rel)
-   (for-each
-    (lambda (type)
-      (hashq-set! ancestor-lookup type
-                 (cons type (hashq-ref ancestor-lookup (car rel) '()))))
-    (cdr rel)))
- event-classes)
 
 (define-public (define-event-class leaf heritage)
   (cond