lalka 0.1.0 → 0.2.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 +107 -0
- data/lib/lalka/version.rb +1 -1
- data/lib/lalka.rb +23 -12
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a73f1888ec88d74b7512761a7ef1a1b225896ea
|
4
|
+
data.tar.gz: d9414cfc7f078a2ca1b5fb55db185109b7939bc8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0ad66f8cb854dd0ba9d7796af9d6ca7b397aaa874fbf781913450e83b3e3626c61d474461604e4e4034fd81a051da61d6b49788d0644259751167cd042f4ceb
|
7
|
+
data.tar.gz: fad058b50f8e5231a817d733ed995ba04f409742b08b377a8761b6bf0ff5c8f936870f3378a0bc8a38c202a553d07c0edce36bc1dec9d622b726e752477b76c5
|
data/README.md
CHANGED
@@ -4,6 +4,113 @@ Welcome to your new gem! In this directory, you'll find the files you need to be
|
|
4
4
|
|
5
5
|
TODO: Delete this and the text above, and describe your gem
|
6
6
|
|
7
|
+
# Usage
|
8
|
+
|
9
|
+
### Create:
|
10
|
+
```ruby
|
11
|
+
task = Lalka::Task.new do |t| # block is not executed untill fork or fork_wait is called
|
12
|
+
t.resolve(value) # resolve task to a value
|
13
|
+
# or
|
14
|
+
t.reject(error) # reject task with an error
|
15
|
+
end
|
16
|
+
```
|
17
|
+
|
18
|
+
### Create with predefined state:
|
19
|
+
```ruby
|
20
|
+
resolved_task = Lalka::Task.resolve(value) # task which resolves to a value
|
21
|
+
rejected_task = Lalka::Task.reject(error) # task which rejects to a value
|
22
|
+
```
|
23
|
+
|
24
|
+
### fork:
|
25
|
+
```ruby
|
26
|
+
# fork is nonblocking, returns nil
|
27
|
+
task.fork do |t|
|
28
|
+
t.on_success do |value|
|
29
|
+
# do something with a value
|
30
|
+
end
|
31
|
+
|
32
|
+
t.on_error do |error|
|
33
|
+
# handle error
|
34
|
+
end
|
35
|
+
end
|
36
|
+
```
|
37
|
+
|
38
|
+
### fork_wait:
|
39
|
+
```ruby
|
40
|
+
# fork_wait blocks and returns Either from "dry-monads" gem
|
41
|
+
task = Lalka::Task.resolve(99)
|
42
|
+
|
43
|
+
result = task.fork_wait do |t|
|
44
|
+
t.on_success do |value|
|
45
|
+
value + 1
|
46
|
+
end
|
47
|
+
|
48
|
+
t.on_error do |error|
|
49
|
+
# ...
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
result # Right(100)
|
54
|
+
```
|
55
|
+
|
56
|
+
```ruby
|
57
|
+
task = Lalka::Task.reject('error')
|
58
|
+
|
59
|
+
result = task.fork_wait do |t|
|
60
|
+
t.on_success do |value|
|
61
|
+
# ...
|
62
|
+
end
|
63
|
+
|
64
|
+
t.on_error do |error|
|
65
|
+
"Error: " + error
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
result # Left("Error: error")
|
70
|
+
```
|
71
|
+
|
72
|
+
### map:
|
73
|
+
```ruby
|
74
|
+
task = Lalka::Task.resolve(99).map { |v| v + 1 }.map { |v| v.to_s + "!" }
|
75
|
+
|
76
|
+
result = task.fork_wait
|
77
|
+
result # Right("100!")
|
78
|
+
```
|
79
|
+
|
80
|
+
```ruby
|
81
|
+
task = Lalka::Task.reject('error').map { |v| v + 1 }.map { |v| v.to_s + "!" }
|
82
|
+
|
83
|
+
result = task.fork_wait
|
84
|
+
result # Left("error")
|
85
|
+
```
|
86
|
+
|
87
|
+
### bind:
|
88
|
+
```ruby
|
89
|
+
task = Lalka::Task.resolve(99).bind { |v| Lalka::Task.resolve(v + 1) }
|
90
|
+
|
91
|
+
result = task.fork_wait
|
92
|
+
result # Right(100)
|
93
|
+
```
|
94
|
+
|
95
|
+
### ap:
|
96
|
+
```ruby
|
97
|
+
task = Lalka::Task.resolve(-> (v) { v + 1 }).ap(Lalka::Task.resolve(99))
|
98
|
+
|
99
|
+
result = task.fork_wait
|
100
|
+
result # Right(100)
|
101
|
+
```
|
102
|
+
|
103
|
+
```ruby
|
104
|
+
task1 = Lalka::Task.resolve(99)
|
105
|
+
task2 = Lalka::Task.resolve(1)
|
106
|
+
|
107
|
+
result = task1.map { |x| -> (y) { x + y } }.ap(task2).fork_wait
|
108
|
+
result # Right(100)
|
109
|
+
|
110
|
+
result = Lalka::Task.resolve(-> (x) { -> (y) { x + y } }).ap(task1).ap(task2).fork_wait
|
111
|
+
result # Right(100)
|
112
|
+
```
|
113
|
+
|
7
114
|
## Installation
|
8
115
|
|
9
116
|
Add this line to your application's Gemfile:
|
data/lib/lalka/version.rb
CHANGED
data/lib/lalka.rb
CHANGED
@@ -18,6 +18,11 @@ module Lalka
|
|
18
18
|
t.reject(error)
|
19
19
|
end
|
20
20
|
end
|
21
|
+
|
22
|
+
def id(internal)
|
23
|
+
internal.on_success { |v| v }
|
24
|
+
internal.on_error { |e| e }
|
25
|
+
end
|
21
26
|
end
|
22
27
|
|
23
28
|
def initialize(&block)
|
@@ -27,7 +32,13 @@ module Lalka
|
|
27
32
|
def fork_wait
|
28
33
|
queue = Queue.new
|
29
34
|
internal = Internal.new(queue)
|
30
|
-
|
35
|
+
|
36
|
+
if block_given?
|
37
|
+
yield internal
|
38
|
+
else
|
39
|
+
Task.id(internal)
|
40
|
+
end
|
41
|
+
|
31
42
|
@computation.call(internal)
|
32
43
|
queue.pop
|
33
44
|
end
|
@@ -42,7 +53,7 @@ module Lalka
|
|
42
53
|
def map
|
43
54
|
Task.new do |t|
|
44
55
|
fork do |this|
|
45
|
-
this.
|
56
|
+
this.on_success do |value|
|
46
57
|
t.resolve(yield value)
|
47
58
|
end
|
48
59
|
|
@@ -56,11 +67,11 @@ module Lalka
|
|
56
67
|
def bind
|
57
68
|
Task.new do |t|
|
58
69
|
fork do |this|
|
59
|
-
this.
|
70
|
+
this.on_success do |first_value|
|
60
71
|
other_task = yield first_value
|
61
72
|
|
62
73
|
other_task.fork do |other|
|
63
|
-
other.
|
74
|
+
other.on_success do |second_value|
|
64
75
|
t.resolve(second_value)
|
65
76
|
end
|
66
77
|
|
@@ -82,7 +93,7 @@ module Lalka
|
|
82
93
|
q = Queue.new
|
83
94
|
|
84
95
|
fork do |this|
|
85
|
-
this.
|
96
|
+
this.on_success do |fn|
|
86
97
|
q.push [:fn, fn]
|
87
98
|
end
|
88
99
|
|
@@ -92,7 +103,7 @@ module Lalka
|
|
92
103
|
end
|
93
104
|
|
94
105
|
other_task.fork do |other|
|
95
|
-
other.
|
106
|
+
other.on_success do |value|
|
96
107
|
q.push [:arg, value]
|
97
108
|
end
|
98
109
|
|
@@ -130,15 +141,15 @@ module Lalka
|
|
130
141
|
|
131
142
|
class InternalAsync
|
132
143
|
def resolve(value)
|
133
|
-
@
|
144
|
+
@on_success.call(value)
|
134
145
|
end
|
135
146
|
|
136
147
|
def reject(error)
|
137
148
|
@on_error.call(error)
|
138
149
|
end
|
139
150
|
|
140
|
-
def
|
141
|
-
@
|
151
|
+
def on_success(&block)
|
152
|
+
@on_success = block
|
142
153
|
nil
|
143
154
|
end
|
144
155
|
|
@@ -154,7 +165,7 @@ module Lalka
|
|
154
165
|
end
|
155
166
|
|
156
167
|
def resolve(value)
|
157
|
-
result = @
|
168
|
+
result = @on_success.call(value)
|
158
169
|
@queue.push Dry::Monads.Right(result)
|
159
170
|
end
|
160
171
|
|
@@ -163,8 +174,8 @@ module Lalka
|
|
163
174
|
@queue.push Dry::Monads.Left(result)
|
164
175
|
end
|
165
176
|
|
166
|
-
def
|
167
|
-
@
|
177
|
+
def on_success(&block)
|
178
|
+
@on_success = block
|
168
179
|
end
|
169
180
|
|
170
181
|
def on_error(&block)
|