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 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