1#lang racket/base
2
3;; intern Def, Use?
4
5;; A Def is (def sym resolved-module-path int)
6(struct def (sym mod phase) #:prefab)
7
8;; A Use is (use Def int)
9;; the offset is (ref-phase - def-phase)
10(struct use (def offset) #:prefab)
11
12;; A resolved is path or symbol.
13
14;; An import is (import resolved int)
15(struct import (resolved offset))
16
17;; ========
18
19;; uses : hash[Use => #t]
20;; reqs : hash[import => mpi]
21;; keeps : hash[import => mpi]
22
23#|
24
25(define (refine uses reqs keeps)
26  (unless (= (hash-count uses) 0)
27    (direct-def-uses uses reqs keeps)
28    (recur-on-imports uses reqs keeps)))
29
30|#
31
32(define (hash-choose h)
33  (let ([i (hash-iterate-first h)])
34    (and i (hash-iterate-value h i))))
35
36#|
37Algorithm for refining bypass modules
38
39loop: set of references (id, phase), set of requires (mod, phase)
40  for every reference DEFINED* in a require R
41    mark that require R NEEDED and remove from set
42    eliminate every reference provided by R
43      (including re-provides)
44  now every reference left is re-provided by some remaining require
45  recur on imports of requires
46
47DEFINED* : really, defined in this module OR imported from a "private" module.
48|#
49
50
51;; ====================
52
53#|
54Another algorithm
55
56Put all requires in priority queue, with max-depth-to-kernel
57priority...
58
59|#
60