|
1332 | 1332 | ;; The range is this map is a list of symbols generated on demand, as we need
|
1333 | 1333 | ;; more dots.
|
1334 | 1334 |
|
1335 |
| -;; Take (generate as needed) n symbols that correspond to variable var used in |
| 1335 | +;; Take (generate as needed) n symbols that correspond to variable dotted-var used in |
1336 | 1336 | ;; the context of type t.
|
1337 | 1337 | ;FIXME no-check, trans-dots needs to be generalised
|
1338 |
| -(t/ann ^:no-check var-store-take [t/Sym r/Type t/Int t/Any -> (t/Seqable t/Sym)]) |
1339 |
| -(defn- var-store-take [var t n {::keys [dotted-var-store] :as opts}] |
1340 |
| - (assert dotted-var-store (keys opts)) |
1341 |
| - ;(t/ann-form dotted-var-store (t/Atom (t/Map '[r/Type t/Sym] (t/Seq t/Sym)))) |
1342 |
| - (let [key [t n] |
1343 |
| - res (@dotted-var-store key)] |
1344 |
| - (if (>= (count res) n) |
1345 |
| - ;; there are enough symbols already, take n |
1346 |
| - (take n res) |
1347 |
| - ;; we need to generate more |
1348 |
| - (let [new (repeatedly (- n (count res)) #(gensym var)) |
1349 |
| - all (concat res new)] |
1350 |
| - (swap! dotted-var-store assoc key all) |
1351 |
| - all)))) |
| 1338 | +(t/ann ^:no-check var-store-take [t/Sym r/Type t/Int t/Any -> (t/Vec t/Sym)]) |
| 1339 | +(defn- var-store-take [dotted-var t n opts] |
| 1340 | + {:pre [(simple-symbol? dotted-var) |
| 1341 | + (r/Type? t) |
| 1342 | + (nat-int? n)] |
| 1343 | + :post [(vector? %)]} |
| 1344 | + (if (zero? n) |
| 1345 | + [] |
| 1346 | + (let [dotted-var-store (::dotted-var-store opts) |
| 1347 | + ;_ (t/ann-form dotted-var-store (t/Atom (t/Map '[r/Type t/Sym] (t/Vec t/Sym)))) |
| 1348 | + k [t n] |
| 1349 | + res (@dotted-var-store k)] |
| 1350 | + (if (>= (count res) n) |
| 1351 | + ;; there are enough symbols already, take n |
| 1352 | + (subvec res 0 n) |
| 1353 | + ;; we need to generate more |
| 1354 | + (-> (swap! dotted-var-store |
| 1355 | + (fn [m] |
| 1356 | + (let [res (m k) |
| 1357 | + cnt (count res)] |
| 1358 | + (cond-> m |
| 1359 | + (< cnt n) |
| 1360 | + (assoc k (into (or res []) (map (fn [_] (gensym dotted-var))) |
| 1361 | + (range (- n cnt)))))))) |
| 1362 | + (get k) |
| 1363 | + (subvec 0 n)))))) |
1352 | 1364 |
|
1353 | 1365 | (defn cs-gen-Function-just-rests [V X Y S T opts]
|
1354 | 1366 | {:pre [(every? #(#{:fixed :rest} (:kind %)) [S T])]}
|
|
0 commit comments