@@ -62,6 +62,10 @@ type Store[K comparable, T any] interface {
6262
6363 // ListEdges should return all edges in the graph in a slice.
6464 ListEdges () ([]Edge [K ], error )
65+
66+ // EdgeCount should return the number of edges in the graph. This should be equal to the
67+ // length of the slice returned by ListEdges.
68+ EdgeCount () (int , error )
6569}
6670
6771type memoryStore [K comparable , T any ] struct {
@@ -73,6 +77,7 @@ type memoryStore[K comparable, T any] struct {
7377 // these edges themselves are stored in maps whose keys are the hashes of the target vertices.
7478 outEdges map [K ]map [K ]Edge [K ] // source -> target
7579 inEdges map [K ]map [K ]Edge [K ] // target -> source
80+ edgeCount int
7681}
7782
7883func newMemoryStore [K comparable , T any ]() Store [K , T ] {
@@ -175,6 +180,8 @@ func (s *memoryStore[K, T]) AddEdge(sourceHash, targetHash K, edge Edge[K]) erro
175180
176181 s.inEdges [targetHash ][sourceHash ] = edge
177182
183+ s .edgeCount ++
184+
178185 return nil
179186}
180187
@@ -198,6 +205,9 @@ func (s *memoryStore[K, T]) RemoveEdge(sourceHash, targetHash K) error {
198205
199206 delete (s .inEdges [targetHash ], sourceHash )
200207 delete (s .outEdges [sourceHash ], targetHash )
208+
209+ s .edgeCount --
210+
201211 return nil
202212}
203213
@@ -218,11 +228,18 @@ func (s *memoryStore[K, T]) Edge(sourceHash, targetHash K) (Edge[K], error) {
218228 return edge , nil
219229}
220230
231+ func (s * memoryStore [K , T ]) EdgeCount () (int , error ) {
232+ s .lock .RLock ()
233+ defer s .lock .RUnlock ()
234+
235+ return s .edgeCount , nil
236+ }
237+
221238func (s * memoryStore [K , T ]) ListEdges () ([]Edge [K ], error ) {
222239 s .lock .RLock ()
223240 defer s .lock .RUnlock ()
224241
225- res := make ([]Edge [K ], 0 )
242+ res := make ([]Edge [K ], 0 , s . edgeCount )
226243 for _ , edges := range s .outEdges {
227244 for _ , edge := range edges {
228245 res = append (res , edge )
0 commit comments