(use-modules (alterator glob))

(define *system-atlas-dir* "/usr/share/alterator/maps/*.map")
(define *local-atlas-dir* "maps/*.map")

(define (load-map file)
  ;;we interest only in view entries, all other entries obsolete
  (call-with-input-file
      file
    (lambda(port)
      (let loop ((info (read port))
                 (result '()))
        (cond
         ((eof-object? info)
          result)
         ((and (pair? info) (eq? (cadr info) 'view))
          (loop (read port) (cons (cons* (car info) (cddr info))
                                  result)))
         (else
          (loop (read port) result)))))))

(define (load-atlas)
  (append-map load-map
              (append (if (fluid-ref use-local-files)
                          (glob *local-atlas-dir*)
                          '())
		      (glob *system-atlas-dir*))))

(define (read-atlas url atlas)
  (let loop ((url url) (result '()))
    (let ((path (assq (sure-symbol url) atlas)))
      (if path
          (loop (cadr path) (append (cddr path) result))
          (cons* 'atlas:url url result)))))

(define atlas (load-atlas))

(object
 #f
 ((read self objects options)
  (read-atlas (string-append "/" (string-join objects "/")) atlas)))
