tangle 0.6.5 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 49f9618a6db24308eea9b672789ec0cb9a75ec124050cc5b748340bbc19ccdea
4
- data.tar.gz: bb5aa5bf4b8e80942c7b2f1871529ef39a2a871ded60a01fb4acf23a288bca41
3
+ metadata.gz: 5203984ea1bf3218c6ac6e2a84493af7feec46d2dda8f6005e8d24b5e81671db
4
+ data.tar.gz: b39938c50a2a828963af60ee6877dae048a52a5a83fb6e5ccadc3f2727cc66d0
5
5
  SHA512:
6
- metadata.gz: 47dddb4a4fa185863f69e06b63526eaa197d4f6bbdd7c5185199f6890eaa10f5799d9137868e7632bf6b1e8fd74c79fea3a066d728ebf0270f91914cd9f81254
7
- data.tar.gz: 2c423486fb396bd060acb919fe00ac4459b7119a0fe08790549300560e39ea8831fb6df792dc5006d9733b085d9eb0ef9d1b957645aaa21cf4b0acfab2dc85a6
6
+ metadata.gz: 5598f8494cee8dfdbbc6061ab2f00596fb70fd419872a8884182c21b0ad0c62c234c2ac766df1dadffa4cd6ce84b60b5a1b44f46cbc27782e162535252db89b2
7
+ data.tar.gz: c34f2d721e72680ffca31108d1b608b868912bc8b631f9abd7ea866335503e287ae9031660a8d2c1e2781a6ce9276c22d302001339522ddf18224b665838695f
@@ -24,9 +24,10 @@ module Tangle
24
24
 
25
25
  protected
26
26
 
27
- def with_vertices(vertex1, vertex2 = vertex1)
28
- @child, @parent = @vertices = [vertex1, vertex2]
29
- self
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
- @edges.select(&selector)
65
+ edges.select(&selector)
65
66
  else
66
- @edges.to_a
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
@@ -8,6 +8,7 @@ module Tangle
8
8
  def initialize_vertices
9
9
  @vertices_by_id = {}
10
10
  @vertices_by_name = {}
11
+ @edges_by_vertex = {}
11
12
  end
12
13
 
13
14
  def initialize_edges
@@ -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
- subgraph { |other| vertex.ancestor?(other) }
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
- subgraph { |other| vertex.descendant?(other) }
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
@@ -7,12 +7,6 @@ module Tangle
7
7
  # A simple graph, without loops and multiple edges
8
8
  class Graph < Tangle::Graph
9
9
  Edge = Tangle::Simple::Edge
10
-
11
- private
12
-
13
- def initialize_edges
14
- @edges = Set[]
15
- end
16
10
  end
17
11
  end
18
12
  end
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 { |edge| edge.include? self }
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)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tangle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.5
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Calle Englund