callable_tree 0.2.0 → 0.2.1
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 +4 -4
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +2 -2
- data/lib/callable_tree.rb +3 -3
- data/lib/callable_tree/node.rb +6 -2
- data/lib/callable_tree/node/external.rb +1 -1
- data/lib/callable_tree/node/internal.rb +23 -8
- data/lib/callable_tree/node/internal/strategy/broadcast.rb +17 -0
- data/lib/callable_tree/node/internal/strategy/compose.rb +21 -0
- data/lib/callable_tree/node/internal/strategy/seek.rb +25 -0
- data/lib/callable_tree/version.rb +1 -1
- metadata +6 -6
- data/lib/callable_tree/node/internal/broadcast.rb +0 -15
- data/lib/callable_tree/node/internal/compose.rb +0 -19
- data/lib/callable_tree/node/internal/seek.rb +0 -23
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 23417eaf997718c6d0e9b5fc52dea3fe4923ca9b426d9d41e57b5e27015d239a
|
|
4
|
+
data.tar.gz: 34be74baf1014e41efbe0073fedfdf76dc02444c927bea2b089d9457842c04b8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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.
|
|
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.
|
|
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'
|
data/lib/callable_tree/node.rb
CHANGED
|
@@ -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
|
|
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
|
-
|
|
30
|
+
root? ? 0 : parent.depth + 1
|
|
27
31
|
end
|
|
28
32
|
|
|
29
33
|
def match?(_input = nil, **_options)
|
|
@@ -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
|
-
|
|
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
|
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.
|
|
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-
|
|
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.
|
|
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
|