#lang racket/base (require racket/contract) (require "tools.rkt" "world.rkt" "ptree-nav.rkt" "ptree-decode.rkt" "debug.rkt") (module+ test (require rackunit)) (provide (all-defined-out) (all-from-out "ptree-nav.rkt")) ;; function to set up the project-ptree. ;; this is to make life simpler when using tree navigation functions. ;; the current main.ptree of the project is used as the default input. ;; without this, you'd have to pass it over and over. ;; which is sort of the functional lifestyle, ;; but in templates, gets tiresome and error-prone. (define/contract (make-project-ptree) (-> ptree?) (define ptree-source (build-path START_DIR DEFAULT_POLLEN_TREE)) (if (file-exists? ptree-source) ;; Load it from default path. ;; dynamic require of a ptree source file gets you a full ptree. (begin (message "Using ptree file" (->string (file-name-from-path ptree-source))) (dynamic-require ptree-source POLLEN_ROOT)) ;; ... or else synthesize it (let* ([files (directory-list START_DIR)] ;; restrict files to those with pollen extensions [files (map remove-ext (filter (λ(x) (has-ext? x POLLEN_SOURCE_EXT)) files))]) ;; make a POLLEN_TREE_ROOT_NAME structure and convert it to a full ptree (message "Generating ptree from file listing") (ptree-root->ptree (cons POLLEN_TREE_ROOT_NAME (map path->pnode files)))))) (set-project-ptree (make-project-ptree))