lalka 0.6.0 → 0.7.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: 803656007eaa3ce1fa9bf0590906f978c296d51f
4
- data.tar.gz: 1e3808e62ec73431dac71b77a020ab6dcda74b43
3
+ metadata.gz: f052e0cce98cefd5a400f81e00280c0670c244dc
4
+ data.tar.gz: e29c8e0b3d7ae4720d91ea5fd061719ce0c43997
5
5
  SHA512:
6
- metadata.gz: ce6d3be7b9c1ad1fd49b43801896bb7f44aeb0e6b472c7386ce4463cdbc6327795ac85478071760268cf97ddaf4b5208f939dc4002f4cdb6799cfdd93c70e041
7
- data.tar.gz: 8bb5196fc4a04021a499104d2bd2bc1083da6aebe0d09bb1301aee0ca3251927bffae52d067d7f2ff7070277070944d39e8523c46a16ff3c689326530bc24eb2
6
+ metadata.gz: e2c4d41777640d33f50a82fdac121d0ca1460e243946ea687ffb66b53d0750b723b16bf475afa4cb647e3e8942dd21ca8c90dc38d124f6855d5aa155c64cf54a
7
+ data.tar.gz: 52c6004164ae271f1c7e5f6bfaa22e80d9538ad6c9988b3c943a4dc4a004296462d5077b91caef47b6cb0dc828d338c2fad680284ebce220329a00ff10ab2973
@@ -1,5 +1,5 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.3.1
4
+ - 2.3.3
5
5
  before_install: gem install bundler -v 1.13.6
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  # Lalka
2
+ [![Build Status](https://travis-ci.org/v-shmyhlo/lalka.svg?branch=master)](https://travis-ci.org/v-shmyhlo/lalka)
2
3
 
3
4
  Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/lalka`. To experiment with that code, run `bin/console` for an interactive prompt.
4
5
 
@@ -1,42 +1,41 @@
1
1
  # coding: utf-8
2
+ # frozen_string_literal: true
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'lalka/version'
5
6
 
6
7
  Gem::Specification.new do |spec|
7
- spec.name = "lalka"
8
+ spec.name = 'lalka'
8
9
  spec.version = Lalka::VERSION
9
- spec.authors = ["Vlad Shmyhlo"]
10
- spec.email = ["aion.stu@gmail.com"]
10
+ spec.authors = ['Vlad Shmyhlo']
11
+ spec.email = ['aion.stu@gmail.com']
11
12
 
12
- spec.summary = "Task monad"
13
- spec.description = "Task monad"
14
- spec.homepage = "https://github.com/v-shmyhlo/lalka"
15
- spec.license = "MIT"
13
+ spec.summary = 'Task monad'
14
+ spec.description = 'Task monad'
15
+ spec.homepage = 'https://github.com/v-shmyhlo/lalka'
16
+ spec.license = 'MIT'
16
17
 
17
18
  # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
19
  # to allow pushing to a single host or delete this section to allow pushing to any host.
19
20
  if spec.respond_to?(:metadata)
20
21
  # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
21
22
  else
22
- raise "RubyGems 2.0 or newer is required to protect against " \
23
- "public gem pushes."
23
+ raise 'RubyGems 2.0 or newer is required to protect against ' \
24
+ 'public gem pushes.'
24
25
  end
25
26
 
26
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
27
28
  f.match(%r{^(test|spec|features)/})
28
29
  end
29
- spec.bindir = "exe"
30
+ spec.bindir = 'exe'
30
31
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
31
- spec.require_paths = ["lib"]
32
+ spec.require_paths = ['lib']
32
33
 
33
- spec.add_dependency "concurrent-ruby"
34
- spec.add_dependency "concurrent-ruby-ext"
35
34
  spec.add_dependency 'dry-monads'
36
35
 
37
- spec.add_development_dependency "bundler", "~> 1.13"
38
- spec.add_development_dependency "rake", "~> 10.0"
39
- spec.add_development_dependency "rspec", "~> 3.0"
40
- spec.add_development_dependency "rubocop"
41
- spec.add_development_dependency "pry"
36
+ spec.add_development_dependency 'bundler', '~> 1.13'
37
+ spec.add_development_dependency 'rake', '~> 10.0'
38
+ spec.add_development_dependency 'rspec', '~> 3.0'
39
+ spec.add_development_dependency 'rubocop'
40
+ spec.add_development_dependency 'pry'
42
41
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
- require 'lalka/version'
3
2
  require 'dry-monads'
4
- require 'concurrent'
3
+
4
+ require 'lalka/version'
5
5
 
6
6
  module Lalka
7
7
  M = Dry::Monads
@@ -27,11 +27,6 @@ module Lalka
27
27
  end
28
28
  end
29
29
 
30
- def id(internal)
31
- internal.on_success { |v| v }
32
- internal.on_error { |e| e }
33
- end
34
-
35
30
  alias of resolve
36
31
  end
37
32
 
@@ -46,7 +41,8 @@ module Lalka
46
41
  if block_given?
47
42
  yield internal
48
43
  else
49
- Task.id(internal)
44
+ internal.on_success { |v| v }
45
+ internal.on_error { |e| e }
50
46
  end
51
47
 
52
48
  internal.call(&@computation)
@@ -104,41 +100,56 @@ module Lalka
104
100
 
105
101
  def ap(other_task)
106
102
  Task.new do |t|
107
- atom = Concurrent::Atom.new(M.Right(fn: M.None(), arg: M.None()))
103
+ mutex = Mutex.new
104
+ completed = false
105
+ either = M.Right([M.None(), M.None()])
108
106
 
109
- atom.add_observer do |_, _, either|
110
- if either.right?
111
- value = either.value
107
+ complete_task = lambda do |&block|
108
+ mutex.synchronize do
109
+ return if completed
112
110
 
113
- value[:fn].bind { |fn| value[:arg].fmap(fn) }.fmap do |result|
114
- t.resolve(result)
115
- atom.delete_observers
116
- end
117
- else
118
- error = either.value
111
+ either = block.call(either)
119
112
 
120
- t.reject(error)
121
- atom.delete_observers
113
+ if either.right?
114
+ (e_fn, e_arg) = either.value
115
+
116
+ e_fn.bind { |fn| e_arg.fmap(fn) }.fmap do |value|
117
+ t.resolve(value)
118
+ completed = true
119
+ end
120
+ else
121
+ error = either.value
122
+ t.reject(error)
123
+ completed = true
124
+ end
122
125
  end
123
126
  end
124
127
 
125
128
  fork do |this|
126
129
  this.on_success do |fn|
127
- atom.swap(fn) { |either, fn| either.bind { |struct| M.Right(struct.merge(fn: M.Some(fn))) } }
130
+ complete_task.call do |either|
131
+ either.bind { |_, e_arg| M.Right([M.Some(fn), e_arg]) }
132
+ end
128
133
  end
129
134
 
130
135
  this.on_error do |error|
131
- atom.swap(error) { |either, error| either.bind { M.Left(error) } }
136
+ complete_task.call do |either|
137
+ either.bind { M.Left(error) }
138
+ end
132
139
  end
133
140
  end
134
141
 
135
142
  other_task.fork do |other|
136
143
  other.on_success do |arg|
137
- atom.swap(arg) { |either, arg| either.bind { |struct| M.Right(struct.merge(arg: M.Some(arg))) } }
144
+ complete_task.call do |either|
145
+ either.bind { |e_fn, _| M.Right([e_fn, M.Some(arg)]) }
146
+ end
138
147
  end
139
148
 
140
149
  other.on_error do |error|
141
- atom.swap(error) { |either, error| either.bind { M.Left(error) } }
150
+ complete_task.call do |either|
151
+ either.bind { M.Left(error) }
152
+ end
142
153
  end
143
154
  end
144
155
  end
@@ -219,7 +230,7 @@ module Lalka
219
230
  result =
220
231
  if @on_error.nil?
221
232
  ArgumentError.new('missing on_error block')
222
- else
233
+ else
223
234
  @on_error.call(error)
224
235
  end
225
236
 
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Lalka
3
- VERSION = '0.6.0'
3
+ VERSION = '0.7.0'
4
4
  end
metadata CHANGED
@@ -1,43 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lalka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.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-21 00:00:00.000000000 Z
11
+ date: 2016-12-23 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'
41
13
  - !ruby/object:Gem::Dependency
42
14
  name: dry-monads
43
15
  requirement: !ruby/object:Gem::Requirement