tiny_frp 1.0.0 → 1.1.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 +4 -4
- data/README.md +2 -2
- data/lib/tiny_frp.rb +52 -1
- data/lib/tiny_frp/version.rb +1 -1
- data/unit_test/test_tiny_frp.rb +15 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e66f1f682e89029ca27be8be4a1333ce0e11704f
|
4
|
+
data.tar.gz: 8606a26d57699ae70a6146acb90dbd1d7a127bc6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a38f4eebfcd858c6455c438c624be6a3fb7a9bfb52362afe8dbe8b38b690142114a4ea12e782440d47c1076938052b2625bfbe8e11caa923fe68a8a39a3b7b4c
|
7
|
+
data.tar.gz: e52ec854b28ff66e4b27da0df75c2fca5253780c0037ec9c9b9af5cfa677431909cd70c8fdef215749e5635968c010184c5a8da0d3e5997ee636048e2d3c2b87
|
data/README.md
CHANGED
@@ -7,7 +7,7 @@ Very small and simple library to do (functional)-reactive-programming in Ruby.
|
|
7
7
|
Add this line to your application's Gemfile:
|
8
8
|
|
9
9
|
```ruby
|
10
|
-
gem '
|
10
|
+
gem 'tiny_frp'
|
11
11
|
```
|
12
12
|
|
13
13
|
And then execute:
|
@@ -16,7 +16,7 @@ And then execute:
|
|
16
16
|
|
17
17
|
Or install it yourself as:
|
18
18
|
|
19
|
-
$ gem install
|
19
|
+
$ gem install tiny_frp
|
20
20
|
|
21
21
|
## Usage
|
22
22
|
|
data/lib/tiny_frp.rb
CHANGED
@@ -27,7 +27,33 @@ module TinyFRP
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def +(node)
|
30
|
-
|
30
|
+
case [self, node]
|
31
|
+
when [Bundle, Bundle]
|
32
|
+
Bundle.new(*(self.nodes + node.nodes))
|
33
|
+
when [Node, Bundle]
|
34
|
+
Bundle.new(*([self] + node.nodes))
|
35
|
+
when [Bundle, Node]
|
36
|
+
Bundle.new(*(self.nodes + [node]))
|
37
|
+
else
|
38
|
+
Bundle.new(self, node)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def *(node)
|
43
|
+
case [self, node]
|
44
|
+
when [Split, Split]
|
45
|
+
Split.new(*(self.nodes + node.nodes))
|
46
|
+
when [Node, Split]
|
47
|
+
Split.new(*([self] + node.nodes))
|
48
|
+
when [Split, Node]
|
49
|
+
Split.new(*(self.nodes + [node]))
|
50
|
+
else
|
51
|
+
Split.new(self, node)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def **(integer)
|
56
|
+
Split.new(*integer.times.map{self})
|
31
57
|
end
|
32
58
|
|
33
59
|
def call(memo, last_memo, *args)
|
@@ -53,6 +79,12 @@ module TinyFRP
|
|
53
79
|
end
|
54
80
|
end
|
55
81
|
|
82
|
+
class Lifta < Lift
|
83
|
+
def calc(memo, last_memo, *args)
|
84
|
+
memo.merge(self => @proc.call(*args))
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
56
88
|
class Foldp < Node
|
57
89
|
def initialize(initial_state, &proc)
|
58
90
|
@initial_state, @proc = initial_state, proc
|
@@ -100,6 +132,8 @@ module TinyFRP
|
|
100
132
|
end
|
101
133
|
|
102
134
|
class Bundle < Node
|
135
|
+
attr_reader :nodes
|
136
|
+
|
103
137
|
def initialize(*nodes)
|
104
138
|
@nodes = nodes
|
105
139
|
end
|
@@ -118,4 +152,21 @@ module TinyFRP
|
|
118
152
|
res.merge(self => @nodes.inject([]){|acc, n| acc + res[n]})
|
119
153
|
end
|
120
154
|
end
|
155
|
+
|
156
|
+
class Split < Node
|
157
|
+
attr_reader :nodes
|
158
|
+
|
159
|
+
def initialize(*nodes)
|
160
|
+
@nodes = nodes
|
161
|
+
end
|
162
|
+
|
163
|
+
def argc
|
164
|
+
@argc ||= @nodes.first.argc
|
165
|
+
end
|
166
|
+
|
167
|
+
def calc(memo, last_memo, *args)
|
168
|
+
res = @nodes.inject(memo){|acc, n| n.call(acc, last_memo, *args)}
|
169
|
+
res.merge(self => @nodes.inject([]){|acc, n| acc + res[n]})
|
170
|
+
end
|
171
|
+
end
|
121
172
|
end
|
data/lib/tiny_frp/version.rb
CHANGED
data/unit_test/test_tiny_frp.rb
CHANGED
@@ -13,6 +13,10 @@ module TinyFRP
|
|
13
13
|
def foldp(init_state, &proc)
|
14
14
|
TinyFRP::Foldp.new(init_state, &proc)
|
15
15
|
end
|
16
|
+
|
17
|
+
def lifta(&proc)
|
18
|
+
TinyFRP::Lifta.new(&proc)
|
19
|
+
end
|
16
20
|
end
|
17
21
|
|
18
22
|
class TinyFRPTest < Test::Unit::TestCase
|
@@ -40,6 +44,17 @@ module TinyFRP
|
|
40
44
|
node = foldp(0){|a| a + 1} + foldp(1){|a| a + 1} + foldp(2){|a| a + 1}
|
41
45
|
assert_equal([[1, 2, 3], [2, 3, 4], [3, 4, 5]], TinyFRP.process(node, 3))
|
42
46
|
end
|
47
|
+
|
48
|
+
def test_split
|
49
|
+
node = foldp(0){|a| a + 1} >> lift{|a| a - 1} * lift{|a| a + 1}
|
50
|
+
assert_equal([[0, 2], [1, 3], [2, 4]], TinyFRP.process(node, 3))
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_lifta
|
54
|
+
inp = lift{0} + lift{1}
|
55
|
+
node = lifta{|a, b| [a, b]} << inp
|
56
|
+
assert_equal([[0, 1], [0, 1], [0, 1]], TinyFRP.process(node, 3))
|
57
|
+
end
|
43
58
|
end
|
44
59
|
end
|
45
60
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tiny_frp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- sawaken
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|