tangle 0.6.5 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/tangle/directed/edge.rb +4 -3
- data/lib/tangle/edge.rb +2 -1
- data/lib/tangle/graph.rb +9 -3
- data/lib/tangle/graph_private.rb +1 -0
- data/lib/tangle/graph_protected.rb +4 -0
- data/lib/tangle/mixin/ancestry.rb +20 -6
- data/lib/tangle/simple/graph.rb +0 -6
- data/lib/tangle/vertex.rb +11 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5203984ea1bf3218c6ac6e2a84493af7feec46d2dda8f6005e8d24b5e81671db
|
4
|
+
data.tar.gz: b39938c50a2a828963af60ee6877dae048a52a5a83fb6e5ccadc3f2727cc66d0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5598f8494cee8dfdbbc6061ab2f00596fb70fd419872a8884182c21b0ad0c62c234c2ac766df1dadffa4cd6ce84b60b5a1b44f46cbc27782e162535252db89b2
|
7
|
+
data.tar.gz: c34f2d721e72680ffca31108d1b608b868912bc8b631f9abd7ea866335503e287ae9031660a8d2c1e2781a6ce9276c22d302001339522ddf18224b665838695f
|
data/lib/tangle/directed/edge.rb
CHANGED
@@ -24,9 +24,10 @@ module Tangle
|
|
24
24
|
|
25
25
|
protected
|
26
26
|
|
27
|
-
def with_vertices(
|
28
|
-
@child
|
29
|
-
|
27
|
+
def with_vertices(child, parent = child)
|
28
|
+
@child = child
|
29
|
+
@parent = parent
|
30
|
+
super
|
30
31
|
end
|
31
32
|
end
|
32
33
|
end
|
data/lib/tangle/edge.rb
CHANGED
@@ -16,7 +16,8 @@ module Tangle
|
|
16
16
|
#
|
17
17
|
# End users should probably use Graph#add_edge instead.
|
18
18
|
#
|
19
|
-
def initialize(vertex1, vertex2 = vertex1, graph: nil, **kwargs)
|
19
|
+
def initialize(vertex1, vertex2 = vertex1, graph: nil, name: nil, **kwargs)
|
20
|
+
@name = name
|
20
21
|
with_graph(graph)
|
21
22
|
with_vertices(vertex1, vertex2)
|
22
23
|
|
data/lib/tangle/graph.rb
CHANGED
@@ -59,11 +59,12 @@ module Tangle
|
|
59
59
|
#
|
60
60
|
# edges => Array
|
61
61
|
#
|
62
|
-
def edges(&selector)
|
62
|
+
def edges(vertex: nil, &selector)
|
63
|
+
edges = vertex.nil? ? @edges : @edges_by_vertex[vertex]
|
63
64
|
if block_given?
|
64
|
-
|
65
|
+
edges.select(&selector)
|
65
66
|
else
|
66
|
-
|
67
|
+
edges.to_a
|
67
68
|
end
|
68
69
|
end
|
69
70
|
|
@@ -130,5 +131,10 @@ module Tangle
|
|
130
131
|
end
|
131
132
|
|
132
133
|
attr_reader :mixins
|
134
|
+
|
135
|
+
def to_s
|
136
|
+
"#<#{self.class}: #{vertices.count} vertices, #{edges.count} edges>"
|
137
|
+
end
|
138
|
+
alias inspect to_s
|
133
139
|
end
|
134
140
|
end
|
data/lib/tangle/graph_private.rb
CHANGED
@@ -10,6 +10,7 @@ module Tangle
|
|
10
10
|
def insert_vertex(vertex)
|
11
11
|
raise ArgumentError unless vertex.graph.eql?(self)
|
12
12
|
|
13
|
+
@edges_by_vertex[vertex] = []
|
13
14
|
@vertices_by_name[vertex.name] = vertex unless vertex.name.nil?
|
14
15
|
@vertices_by_id[vertex.vertex_id] = vertex
|
15
16
|
end
|
@@ -20,6 +21,9 @@ module Tangle
|
|
20
21
|
raise ArgumentError unless edge.graph.eql?(self)
|
21
22
|
|
22
23
|
@edges << edge
|
24
|
+
edge.vertices.each do |vertex|
|
25
|
+
@edges_by_vertex[vertex] << edge
|
26
|
+
end
|
23
27
|
edge
|
24
28
|
end
|
25
29
|
|
@@ -12,12 +12,14 @@ module Tangle
|
|
12
12
|
module Graph
|
13
13
|
include Tangle::Mixin::Connectedness::Graph
|
14
14
|
|
15
|
-
def ancestor_subgraph(vertex)
|
16
|
-
|
15
|
+
def ancestor_subgraph(vertex, &selector)
|
16
|
+
vertex = get_vertex(vertex) unless vertex.is_a? Vertex
|
17
|
+
clone.with_vertices(vertex.ancestors(&selector)).with_edges(edges)
|
17
18
|
end
|
18
19
|
|
19
|
-
def descendant_subgraph(vertex)
|
20
|
-
|
20
|
+
def descendant_subgraph(vertex, &selector)
|
21
|
+
vertex = get_vertex(vertex) unless vertex.is_a? Vertex
|
22
|
+
clone.with_vertices(vertex.descendants(&selector)).with_edges(edges)
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
@@ -28,13 +30,19 @@ module Tangle
|
|
28
30
|
include Tangle::Mixin::Connectedness::Vertex
|
29
31
|
|
30
32
|
def parent_edges
|
31
|
-
@graph.edges { |edge| edge.child?(self) }
|
33
|
+
@graph.edges(vertex: self) { |edge| edge.child?(self) }
|
32
34
|
end
|
33
35
|
|
34
36
|
def parents
|
35
37
|
neighbours(parent_edges)
|
36
38
|
end
|
37
39
|
|
40
|
+
def ancestors
|
41
|
+
result = [self] + parents.flat_map(&:ancestors)
|
42
|
+
return result unless block_given?
|
43
|
+
result.select(&:yield)
|
44
|
+
end
|
45
|
+
|
38
46
|
def parent?(other)
|
39
47
|
@graph.edges.any? { |edge| edge.child?(self) && edge.parent?(other) }
|
40
48
|
end
|
@@ -44,7 +52,7 @@ module Tangle
|
|
44
52
|
end
|
45
53
|
|
46
54
|
def child_edges
|
47
|
-
@graph.edges { |edge| edge.parent?(self) }
|
55
|
+
@graph.edges(vertex: self) { |edge| edge.parent?(self) }
|
48
56
|
end
|
49
57
|
|
50
58
|
def children
|
@@ -55,6 +63,12 @@ module Tangle
|
|
55
63
|
@graph.edges.any? { |edge| edge.parent?(self) && edge.child?(other) }
|
56
64
|
end
|
57
65
|
|
66
|
+
def descendants
|
67
|
+
result = [self] + children.flat_map(&:descendants)
|
68
|
+
return result unless block_given?
|
69
|
+
result.select(&:yield)
|
70
|
+
end
|
71
|
+
|
58
72
|
def descendant?(other)
|
59
73
|
other == self || children.any? { |child| child.descendant?(other) }
|
60
74
|
end
|
data/lib/tangle/simple/graph.rb
CHANGED
data/lib/tangle/vertex.rb
CHANGED
@@ -46,7 +46,7 @@ module Tangle
|
|
46
46
|
def edges
|
47
47
|
return [] if @graph.nil?
|
48
48
|
|
49
|
-
@graph.edges
|
49
|
+
@graph.edges(vertex: self)
|
50
50
|
end
|
51
51
|
|
52
52
|
# Return the set of adjacent vertices
|
@@ -84,6 +84,16 @@ module Tangle
|
|
84
84
|
attr_reader :name
|
85
85
|
attr_reader :vertex_id
|
86
86
|
|
87
|
+
def to_s
|
88
|
+
values = {
|
89
|
+
class: self.class,
|
90
|
+
ident: name.nil? ? format('0x%x', vertex_id) : "'#{name}'",
|
91
|
+
n_edges: edges.count
|
92
|
+
}
|
93
|
+
format('#<%<class>s:%<ident>s: %<n_edges>d edges>', values)
|
94
|
+
end
|
95
|
+
alias inspect to_s
|
96
|
+
|
87
97
|
protected
|
88
98
|
|
89
99
|
def with_graph(graph)
|