callable_tree 0.2.0 → 0.2.1

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: 9213a2a82a38c85e401f291bf2d37e60210bf167c765576033eed93fb1d7cbbd
4
- data.tar.gz: 4a3f2fce73c82b8e5b7e537d21eeedc500e84dbe9f3c972c596701b654a9f234
3
+ metadata.gz: 23417eaf997718c6d0e9b5fc52dea3fe4923ca9b426d9d41e57b5e27015d239a
4
+ data.tar.gz: 34be74baf1014e41efbe0073fedfdf76dc02444c927bea2b089d9457842c04b8
5
5
  SHA512:
6
- metadata.gz: 72ccbffb1ffe2e66ddf41b2f29c715c9cda1d6a91dc8ee5ef493bcaa531b2c1c99ee9024b1776a8c9ecad6e82b84b051d0121c55e9abc26a1ba3d4bb449dced2
7
- data.tar.gz: 243f05208c10de0a60af884479f8a2a9d3edc5735b16fece2994b694d0734bf75f57f1dfc57afc8c265df038fe736fd86e063042362d495140410819f47bbc70
6
+ metadata.gz: 686e18552c5decad326d7bd0775a2be0b3726245edea1ccf2dbdf0ca3e264ec88883bf79cea5af873b074feff1b63e49b59522b5f3b7fc00e06122d494277cea
7
+ data.tar.gz: 7db8a88a1bc19677f453237dd15137da05f3fdb2ddb25aeedd11df82e6afd7c769d3da3c61e9905c40285d35ea54059c6749b4f32a354fc542d7bd26fdd8992f
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.2.1] - 2021-07-24
4
+ - Add `CallableTree::Node::root?`.
5
+ - Add `CallableTree::Node::Internal#seek!` that make destructive change.
6
+ - Add `CallableTree::Node::Internal#broadcast!` that make destructive change.
7
+ - Add `CallableTree::Node::Internal#compose!` that make destructive change.
8
+
3
9
  ## [0.2.0] - 2021-06-15
4
10
  - Change `CallableTree::Node::Internal#append` to return a new instance.
5
11
  To keep the same behavior as the older version, use `CallableTree::Node::External#append!` that make destructive change.
data/Gemfile.lock CHANGED
@@ -1,13 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- callable_tree (0.2.0)
4
+ callable_tree (0.2.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  diff-lcs (1.4.4)
10
- rake (13.0.3)
10
+ rake (13.0.6)
11
11
  rspec (3.10.0)
12
12
  rspec-core (~> 3.10.0)
13
13
  rspec-expectations (~> 3.10.0)
data/lib/callable_tree.rb CHANGED
@@ -8,9 +8,9 @@ require 'forwardable'
8
8
  require_relative 'callable_tree/version'
9
9
  require_relative 'callable_tree/node'
10
10
  require_relative 'callable_tree/node/hooks/call'
11
- require_relative 'callable_tree/node/internal/broadcast'
12
- require_relative 'callable_tree/node/internal/seek'
13
- require_relative 'callable_tree/node/internal/compose'
11
+ require_relative 'callable_tree/node/internal/strategy/broadcast'
12
+ require_relative 'callable_tree/node/internal/strategy/seek'
13
+ require_relative 'callable_tree/node/internal/strategy/compose'
14
14
  require_relative 'callable_tree/node/external/verbose'
15
15
  require_relative 'callable_tree/node/external'
16
16
  require_relative 'callable_tree/node/internal'
@@ -4,12 +4,16 @@ module CallableTree
4
4
  module Node
5
5
  attr_reader :parent
6
6
 
7
+ def root?
8
+ parent.nil?
9
+ end
10
+
7
11
  def ancestors
8
12
  ::Enumerator.new do |y|
9
13
  node = self
10
14
  loop do
11
15
  y << node
12
- break unless node = node&.parent
16
+ break unless node = node.parent
13
17
  end
14
18
  end
15
19
  end
@@ -23,7 +27,7 @@ module CallableTree
23
27
  end
24
28
 
25
29
  def depth
26
- parent.nil? ? 0 : parent.depth + 1
30
+ root? ? 0 : parent.depth + 1
27
31
  end
28
32
 
29
33
  def match?(_input = nil, **_options)
@@ -41,7 +41,7 @@ module CallableTree
41
41
 
42
42
  def initialize_copy(_node)
43
43
  super
44
- send(:parent=, nil)
44
+ self.parent = nil
45
45
  end
46
46
 
47
47
  class Proxy
@@ -32,35 +32,50 @@ module CallableTree
32
32
  end
33
33
 
34
34
  def seek
35
- if strategy.is_a?(Seek)
35
+ if strategy.is_a?(Strategy::Seek)
36
36
  self
37
37
  else
38
38
  clone.tap do |node|
39
- node.send(:strategy=, Seek.new)
39
+ node.send(:strategy=, Strategy::Seek.new)
40
40
  end
41
41
  end
42
42
  end
43
43
 
44
+ def seek!
45
+ self.strategy = Strategy::Seek.new unless strategy.is_a?(Strategy::Seek)
46
+ self
47
+ end
48
+
44
49
  def broadcast
45
- if strategy.is_a?(Broadcast)
50
+ if strategy.is_a?(Strategy::Broadcast)
46
51
  self
47
52
  else
48
53
  clone.tap do |node|
49
- node.send(:strategy=, Broadcast.new)
54
+ node.send(:strategy=, Strategy::Broadcast.new)
50
55
  end
51
56
  end
52
57
  end
53
58
 
59
+ def broadcast!
60
+ self.strategy = Strategy::Broadcast.new unless strategy.is_a?(Strategy::Broadcast)
61
+ self
62
+ end
63
+
54
64
  def compose
55
- if strategy.is_a?(Compose)
65
+ if strategy.is_a?(Strategy::Compose)
56
66
  self
57
67
  else
58
68
  clone.tap do |node|
59
- node.send(:strategy=, Compose.new)
69
+ node.send(:strategy=, Strategy::Compose.new)
60
70
  end
61
71
  end
62
72
  end
63
73
 
74
+ def compose!
75
+ self.strategy = Strategy::Compose.new unless strategy.is_a?(Strategy::Compose)
76
+ self
77
+ end
78
+
64
79
  private
65
80
 
66
81
  attr_writer :children, :strategy
@@ -75,12 +90,12 @@ module CallableTree
75
90
  end
76
91
 
77
92
  def strategy
78
- @strategy ||= Seek.new
93
+ @strategy ||= Strategy::Seek.new
79
94
  end
80
95
 
81
96
  def initialize_copy(_node)
82
97
  super
83
- send(:parent=, nil)
98
+ self.parent = nil
84
99
  self.children = children.map do |node|
85
100
  node.clone.tap { |new_node| new_node.send(:parent=, self) }
86
101
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CallableTree
4
+ module Node
5
+ module Internal
6
+ module Strategy
7
+ class Broadcast
8
+ def call(nodes, input:, options:)
9
+ nodes.map do |node|
10
+ node.call(input, **options) if node.match?(input, **options)
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CallableTree
4
+ module Node
5
+ module Internal
6
+ module Strategy
7
+ class Compose
8
+ def call(nodes, input:, options:)
9
+ nodes.reduce(input) do |input, node|
10
+ if node.match?(input, **options)
11
+ node.call(input, **options)
12
+ else
13
+ input
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CallableTree
4
+ module Node
5
+ module Internal
6
+ module Strategy
7
+ class Seek
8
+ def call(nodes, input:, options:)
9
+ nodes
10
+ .lazy
11
+ .select { |node| node.match?(input, **options) }
12
+ .map do |node|
13
+ output = node.call(input, **options)
14
+ terminated = node.terminate?(output, **options)
15
+ [output, terminated]
16
+ end
17
+ .select { |_output, terminated| terminated }
18
+ .map { |output, _terminated| output }
19
+ .first
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module CallableTree
4
- VERSION = '0.2.0'
4
+ VERSION = '0.2.1'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: callable_tree
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - jsmmr
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-06-14 00:00:00.000000000 Z
11
+ date: 2021-07-24 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Builds a tree by linking callable nodes. The nodes that match the conditions
14
14
  are called in a chain from the root node to the leaf node. These are like nested
@@ -49,9 +49,9 @@ files:
49
49
  - lib/callable_tree/node/external/verbose.rb
50
50
  - lib/callable_tree/node/hooks/call.rb
51
51
  - lib/callable_tree/node/internal.rb
52
- - lib/callable_tree/node/internal/broadcast.rb
53
- - lib/callable_tree/node/internal/compose.rb
54
- - lib/callable_tree/node/internal/seek.rb
52
+ - lib/callable_tree/node/internal/strategy/broadcast.rb
53
+ - lib/callable_tree/node/internal/strategy/compose.rb
54
+ - lib/callable_tree/node/internal/strategy/seek.rb
55
55
  - lib/callable_tree/node/root.rb
56
56
  - lib/callable_tree/version.rb
57
57
  homepage: https://github.com/jsmmr/ruby_callable_tree
@@ -60,7 +60,7 @@ licenses:
60
60
  metadata:
61
61
  homepage_uri: https://github.com/jsmmr/ruby_callable_tree
62
62
  source_code_uri: https://github.com/jsmmr/ruby_callable_tree
63
- changelog_uri: https://github.com/jsmmr/ruby_callable_tree/blob/v0.2.0/CHANGELOG.md
63
+ changelog_uri: https://github.com/jsmmr/ruby_callable_tree/blob/v0.2.1/CHANGELOG.md
64
64
  post_install_message:
65
65
  rdoc_options: []
66
66
  require_paths:
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module CallableTree
4
- module Node
5
- module Internal
6
- class Broadcast
7
- def call(nodes, input:, options:)
8
- nodes.map do |node|
9
- node.call(input, **options) if node.match?(input, **options)
10
- end
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,19 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module CallableTree
4
- module Node
5
- module Internal
6
- class Compose
7
- def call(nodes, input:, options:)
8
- nodes.reduce(input) do |input, node|
9
- if node.match?(input, **options)
10
- node.call(input, **options)
11
- else
12
- input
13
- end
14
- end
15
- end
16
- end
17
- end
18
- end
19
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module CallableTree
4
- module Node
5
- module Internal
6
- class Seek
7
- def call(nodes, input:, options:)
8
- nodes
9
- .lazy
10
- .select { |node| node.match?(input, **options) }
11
- .map do |node|
12
- output = node.call(input, **options)
13
- terminated = node.terminate?(output, **options)
14
- [output, terminated]
15
- end
16
- .select { |_output, terminated| terminated }
17
- .map { |output, _terminated| output }
18
- .first
19
- end
20
- end
21
- end
22
- end
23
- end