1
2
3
4
5 package stdlib
6
7
8
9
10
11
12
13 import (
14 "encoding/binary"
15 "iter"
16 "slices"
17 "strings"
18 )
19
20
21
22
23
24
25
26 func Imports(pkgs ...string) iter.Seq[string] {
27 return func(yield func(string) bool) {
28 for _, pkg := range pkgs {
29 if i, ok := find(pkg); ok {
30 var depIndex uint64
31 for data := []byte(deps[i].deps); len(data) > 0; {
32 delta, n := binary.Uvarint(data)
33 depIndex += delta
34 if !yield(deps[depIndex].name) {
35 return
36 }
37 data = data[n:]
38 }
39 }
40 }
41 }
42 }
43
44
45
46
47
48
49
50
51 func Dependencies(pkgs ...string) iter.Seq[string] {
52 return func(yield func(string) bool) {
53 for _, pkg := range pkgs {
54 if i, ok := find(pkg); ok {
55 var seen [1 + len(deps)/8]byte
56 var visit func(i int) bool
57 visit = func(i int) bool {
58 bit := byte(1) << (i % 8)
59 if seen[i/8]&bit == 0 {
60 seen[i/8] |= bit
61 var depIndex uint64
62 for data := []byte(deps[i].deps); len(data) > 0; {
63 delta, n := binary.Uvarint(data)
64 depIndex += delta
65 if !visit(int(depIndex)) {
66 return false
67 }
68 data = data[n:]
69 }
70 if !yield(deps[i].name) {
71 return false
72 }
73 }
74 return true
75 }
76 if !visit(i) {
77 return
78 }
79 }
80 }
81 }
82 }
83
84
85 func find(pkg string) (int, bool) {
86 return slices.BinarySearchFunc(deps[:], pkg, func(p pkginfo, n string) int {
87 return strings.Compare(p.name, n)
88 })
89 }
90
View as plain text