lalka 0.3.0 → 0.4.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/lalka.gemspec +2 -2
- data/lib/lalka.rb +33 -34
- data/lib/lalka/version.rb +1 -1
- metadata +30 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2c89e1ae29d8f65245cab3ad0730a8b26087859c
|
4
|
+
data.tar.gz: 05925e8d18a6850d9a5e52ca16306856c252a024
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 38462cfd7c7ad8218fe445cd3bf5ab8c50172cee6779bb5ff29533c12c095b27969faaaf5a8f853f20bac41d658dd2d19e09876b5f97a16806e35025c9508a03
|
7
|
+
data.tar.gz: 76806c3b825c7cda3b42cbcf46f0a0068e78337ebce51be1678a5c60981110b06fdcc66cc493f00315bb67ef12a6d279c4fcbd92ad8bf53706bed2d7e95772c3
|
data/lalka.gemspec
CHANGED
@@ -30,8 +30,8 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
31
31
|
spec.require_paths = ["lib"]
|
32
32
|
|
33
|
-
|
34
|
-
|
33
|
+
spec.add_dependency "concurrent-ruby"
|
34
|
+
spec.add_dependency "concurrent-ruby-ext"
|
35
35
|
spec.add_dependency 'dry-monads'
|
36
36
|
|
37
37
|
spec.add_development_dependency "bundler", "~> 1.13"
|
data/lib/lalka.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'lalka/version'
|
3
3
|
require 'dry-monads'
|
4
|
+
require 'concurrent'
|
4
5
|
|
5
6
|
module Lalka
|
6
7
|
# TODO: Invalidate resolve and reject at the same time
|
7
8
|
|
8
9
|
class Task
|
10
|
+
M = Dry::Monads
|
11
|
+
|
9
12
|
class << self
|
10
13
|
def resolve(value)
|
11
14
|
new do |t|
|
@@ -13,8 +16,6 @@ module Lalka
|
|
13
16
|
end
|
14
17
|
end
|
15
18
|
|
16
|
-
alias of resolve
|
17
|
-
|
18
19
|
def reject(error)
|
19
20
|
new do |t|
|
20
21
|
t.reject(error)
|
@@ -31,6 +32,8 @@ module Lalka
|
|
31
32
|
internal.on_success { |v| v }
|
32
33
|
internal.on_error { |e| e }
|
33
34
|
end
|
35
|
+
|
36
|
+
alias of resolve
|
34
37
|
end
|
35
38
|
|
36
39
|
def initialize(&block)
|
@@ -98,53 +101,49 @@ module Lalka
|
|
98
101
|
|
99
102
|
def ap(other_task)
|
100
103
|
Task.new do |t|
|
101
|
-
|
104
|
+
atom = Concurrent::Agent.new(M.Right(fn: M.None(), arg: M.None()))
|
102
105
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
end
|
106
|
+
atom.add_observer do |_, _, either|
|
107
|
+
if either.right?
|
108
|
+
value = either.value
|
107
109
|
|
108
|
-
|
109
|
-
|
110
|
+
value[:fn].bind { |fn| value[:arg].fmap(fn) }.fmap do |result|
|
111
|
+
t.resolve(result)
|
112
|
+
atom.delete_observers
|
113
|
+
end
|
114
|
+
else
|
115
|
+
error = either.value
|
116
|
+
|
117
|
+
t.reject(error)
|
118
|
+
atom.delete_observers
|
110
119
|
end
|
111
120
|
end
|
112
121
|
|
113
122
|
fork do |this|
|
114
123
|
this.on_success do |fn|
|
115
|
-
|
124
|
+
atom.send(fn) { |either, fn| either.bind { |struct| M.Right(struct.merge(fn: M.Some(fn))) } }
|
116
125
|
end
|
117
126
|
|
118
127
|
this.on_error do |error|
|
119
|
-
|
128
|
+
atom.send(error) { |either, error| either.bind { M.Left(error) } }
|
120
129
|
end
|
121
130
|
end
|
122
131
|
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
private
|
132
|
+
other_task.fork do |other|
|
133
|
+
other.on_success do |arg|
|
134
|
+
atom.send(arg) { |either, arg| either.bind { |struct| M.Right(struct.merge(arg: M.Some(arg))) } }
|
135
|
+
end
|
128
136
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
task.resolve(result)
|
133
|
-
else
|
134
|
-
type, value = queue.pop
|
135
|
-
|
136
|
-
case type
|
137
|
-
when :error
|
138
|
-
task.reject(value)
|
139
|
-
when :fn
|
140
|
-
ap_aux(task, queue, [true, value], arg)
|
141
|
-
when :arg
|
142
|
-
ap_aux(task, queue, fn, [true, value])
|
143
|
-
else
|
144
|
-
raise 'Unknown type'
|
137
|
+
other.on_error do |error|
|
138
|
+
atom.send(error) { |either, error| either.bind { M.Left(error) } }
|
139
|
+
end
|
145
140
|
end
|
146
141
|
end
|
147
142
|
end
|
143
|
+
|
144
|
+
alias fmap map
|
145
|
+
alias chain bind
|
146
|
+
alias flat_map bind
|
148
147
|
end
|
149
148
|
|
150
149
|
class InternalBase
|
@@ -182,12 +181,12 @@ module Lalka
|
|
182
181
|
|
183
182
|
def resolve(value)
|
184
183
|
result = @on_success.call(value)
|
185
|
-
@queue.push
|
184
|
+
@queue.push M.Right(result)
|
186
185
|
end
|
187
186
|
|
188
187
|
def reject(error)
|
189
188
|
result = @on_error.call(error)
|
190
|
-
@queue.push
|
189
|
+
@queue.push M.Left(result)
|
191
190
|
end
|
192
191
|
end
|
193
192
|
end
|
data/lib/lalka/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lalka
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vlad Shmyhlo
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-12-
|
11
|
+
date: 2016-12-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: concurrent-ruby
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: concurrent-ruby-ext
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: dry-monads
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|