lalka 0.3.0 → 0.4.0

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
  SHA1:
3
- metadata.gz: a2c8ed4e0c9d220a12dee163cd1bf8374345335d
4
- data.tar.gz: 972691694aa8089be51371b55c1e19fcefacb395
3
+ metadata.gz: 2c89e1ae29d8f65245cab3ad0730a8b26087859c
4
+ data.tar.gz: 05925e8d18a6850d9a5e52ca16306856c252a024
5
5
  SHA512:
6
- metadata.gz: 81fc544ab2f9ba714e75d381ef1251dbbd60ae0209a21e33069a7b3c9f010216af8f158c95be505ef5f15a639e898b6b53a479e2c58154e6b92ffffdaaee2555
7
- data.tar.gz: c605549c2e9b112d86358db31f0fcd4741d6284fe7a1025d1f56e35dddbe1776da3b1bbd781ea918f965a1b001c2cbe9170e9a4bd9ed1d89aa9c401d21c09387
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
- # spec.add_dependency "concurrent-ruby"
34
- # spec.add_dependency "concurrent-ruby-ext"
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
- q = Queue.new
104
+ atom = Concurrent::Agent.new(M.Right(fn: M.None(), arg: M.None()))
102
105
 
103
- other_task.fork do |other|
104
- other.on_success do |value|
105
- q.push [:arg, value]
106
- end
106
+ atom.add_observer do |_, _, either|
107
+ if either.right?
108
+ value = either.value
107
109
 
108
- other.on_error do |error|
109
- q.push [:error, error]
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
- q.push [:fn, fn]
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
- q.push [:error, error]
128
+ atom.send(error) { |either, error| either.bind { M.Left(error) } }
120
129
  end
121
130
  end
122
131
 
123
- ap_aux(t, q, [false, nil], [false, nil])
124
- end
125
- end
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
- def ap_aux(task, queue, fn, arg)
130
- if fn[0] && arg[0]
131
- result = fn[1].call(arg[1])
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 Dry::Monads.Right(result)
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 Dry::Monads.Left(result)
189
+ @queue.push M.Left(result)
191
190
  end
192
191
  end
193
192
  end
data/lib/lalka/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Lalka
3
- VERSION = '0.3.0'
3
+ VERSION = '0.4.0'
4
4
  end
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.3.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-12 00:00:00.000000000 Z
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