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 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