dry-effects 0.1.0.alpha

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.
Files changed (68) hide show
  1. checksums.yaml +7 -0
  2. data/.codeclimate.yml +15 -0
  3. data/.gitignore +12 -0
  4. data/.rspec +3 -0
  5. data/.rubocop.yml +73 -0
  6. data/.travis.yml +31 -0
  7. data/CHANGELOG.md +3 -0
  8. data/CONTRIBUTING.md +29 -0
  9. data/Gemfile +22 -0
  10. data/LICENSE +21 -0
  11. data/README.md +20 -0
  12. data/Rakefile +8 -0
  13. data/dry-effects.gemspec +48 -0
  14. data/examples/amb.rb +51 -0
  15. data/examples/state.rb +29 -0
  16. data/lib/dry/effects.rb +42 -0
  17. data/lib/dry/effects/all.rb +47 -0
  18. data/lib/dry/effects/constructors.rb +8 -0
  19. data/lib/dry/effects/container.rb +11 -0
  20. data/lib/dry/effects/effect.rb +29 -0
  21. data/lib/dry/effects/effects/amb.rb +23 -0
  22. data/lib/dry/effects/effects/async.rb +22 -0
  23. data/lib/dry/effects/effects/cache.rb +67 -0
  24. data/lib/dry/effects/effects/current_time.rb +27 -0
  25. data/lib/dry/effects/effects/defer.rb +31 -0
  26. data/lib/dry/effects/effects/env.rb +31 -0
  27. data/lib/dry/effects/effects/fork.rb +21 -0
  28. data/lib/dry/effects/effects/implicit.rb +25 -0
  29. data/lib/dry/effects/effects/interrupt.rb +29 -0
  30. data/lib/dry/effects/effects/lock.rb +45 -0
  31. data/lib/dry/effects/effects/parallel.rb +19 -0
  32. data/lib/dry/effects/effects/random.rb +19 -0
  33. data/lib/dry/effects/effects/reader.rb +15 -0
  34. data/lib/dry/effects/effects/resolve.rb +26 -0
  35. data/lib/dry/effects/effects/retry.rb +26 -0
  36. data/lib/dry/effects/effects/state.rb +50 -0
  37. data/lib/dry/effects/errors.rb +68 -0
  38. data/lib/dry/effects/extensions.rb +13 -0
  39. data/lib/dry/effects/extensions/auto_inject.rb +67 -0
  40. data/lib/dry/effects/extensions/system.rb +43 -0
  41. data/lib/dry/effects/halt.rb +29 -0
  42. data/lib/dry/effects/handler.rb +58 -0
  43. data/lib/dry/effects/inflector.rb +9 -0
  44. data/lib/dry/effects/initializer.rb +99 -0
  45. data/lib/dry/effects/instruction.rb +8 -0
  46. data/lib/dry/effects/instructions/execute.rb +25 -0
  47. data/lib/dry/effects/instructions/raise.rb +25 -0
  48. data/lib/dry/effects/provider.rb +29 -0
  49. data/lib/dry/effects/provider/class_interface.rb +61 -0
  50. data/lib/dry/effects/providers/amb.rb +36 -0
  51. data/lib/dry/effects/providers/async.rb +31 -0
  52. data/lib/dry/effects/providers/cache.rb +43 -0
  53. data/lib/dry/effects/providers/current_time.rb +49 -0
  54. data/lib/dry/effects/providers/defer.rb +84 -0
  55. data/lib/dry/effects/providers/env.rb +65 -0
  56. data/lib/dry/effects/providers/fork.rb +23 -0
  57. data/lib/dry/effects/providers/implicit.rb +39 -0
  58. data/lib/dry/effects/providers/interrupt.rb +37 -0
  59. data/lib/dry/effects/providers/lock.rb +125 -0
  60. data/lib/dry/effects/providers/parallel.rb +34 -0
  61. data/lib/dry/effects/providers/random.rb +13 -0
  62. data/lib/dry/effects/providers/reader.rb +61 -0
  63. data/lib/dry/effects/providers/resolve.rb +88 -0
  64. data/lib/dry/effects/providers/retry.rb +59 -0
  65. data/lib/dry/effects/providers/state.rb +30 -0
  66. data/lib/dry/effects/stack.rb +67 -0
  67. data/lib/dry/effects/version.rb +7 -0
  68. metadata +263 -0
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/effects/providers/reader'
4
+ require 'dry/effects/instructions/raise'
5
+
6
+ module Dry
7
+ module Effects
8
+ module Providers
9
+ class State < Reader[:state]
10
+ def write(value)
11
+ case value
12
+ when state_type
13
+ @state = value
14
+ else
15
+ Instructions.Raise(Errors::InvalidValueError.new(state, value))
16
+ end
17
+ end
18
+
19
+ def call(stack, state = Undefined)
20
+ r = super
21
+ [self.state, r]
22
+ end
23
+
24
+ def provide?(effect)
25
+ effect.type.equal?(:state) && scope.equal?(effect.scope)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'dry/effects/initializer'
4
+ require 'dry/effects/effect'
5
+ require 'dry/effects/instructions/raise'
6
+
7
+ module Dry
8
+ module Effects
9
+ class Stack
10
+ extend Initializer
11
+ include Enumerable
12
+ include Dry::Equalizer(:providers)
13
+
14
+ param :providers, default: -> { [] }
15
+
16
+ def call(effect)
17
+ if effect.is_a?(Effect) && (provider = provider(effect))
18
+ provider.public_send(effect.name, *effect.payload)
19
+ else
20
+ yield
21
+ end
22
+ rescue ::Exception => e
23
+ Instructions::Raise.new(e)
24
+ end
25
+
26
+ def push(provider, args)
27
+ provider.(self, *args) do
28
+ providers.unshift(provider)
29
+ yield
30
+ ensure
31
+ providers.shift
32
+ end
33
+ end
34
+
35
+ def provider(effect)
36
+ find { |p| p.provide?(effect) }
37
+ end
38
+
39
+ def each(&block)
40
+ providers.each(&block)
41
+ end
42
+
43
+ def size
44
+ providers.size
45
+ end
46
+
47
+ def empty?
48
+ providers.empty?
49
+ end
50
+
51
+ def dup
52
+ Stack.new(map(&:dup))
53
+ end
54
+
55
+ def to_s
56
+ if empty?
57
+ '#<Dry::Effects::Stack>'
58
+ else
59
+ stack = map(&:represent).reverse.join('->')
60
+
61
+ "#<Dry::Effects::Stack #{stack}>"
62
+ end
63
+ end
64
+ alias_method :inspect, :to_s
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dry
4
+ module Effects
5
+ VERSION = '0.1.0.alpha'
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,263 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dry-effects
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.alpha
5
+ platform: ruby
6
+ authors:
7
+ - Nikita Shilnikov
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-08-18 00:00:00.000000000 Z
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: '1.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: dry-container
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.7'
34
+ - - ">="
35
+ - !ruby/object:Gem::Version
36
+ version: 0.7.2
37
+ type: :runtime
38
+ prerelease: false
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - "~>"
42
+ - !ruby/object:Gem::Version
43
+ version: '0.7'
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: 0.7.2
47
+ - !ruby/object:Gem::Dependency
48
+ name: dry-core
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.4'
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 0.4.7
57
+ type: :runtime
58
+ prerelease: false
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "~>"
62
+ - !ruby/object:Gem::Version
63
+ version: '0.4'
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: 0.4.7
67
+ - !ruby/object:Gem::Dependency
68
+ name: dry-equalizer
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '0.2'
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: 0.2.2
77
+ type: :runtime
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: '0.2'
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: 0.2.2
87
+ - !ruby/object:Gem::Dependency
88
+ name: dry-inflector
89
+ requirement: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - "~>"
92
+ - !ruby/object:Gem::Version
93
+ version: '0.1'
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: 0.1.2
97
+ type: :runtime
98
+ prerelease: false
99
+ version_requirements: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.1'
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: 0.1.2
107
+ - !ruby/object:Gem::Dependency
108
+ name: dry-initializer
109
+ requirement: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - "~>"
112
+ - !ruby/object:Gem::Version
113
+ version: '3.0'
114
+ type: :runtime
115
+ prerelease: false
116
+ version_requirements: !ruby/object:Gem::Requirement
117
+ requirements:
118
+ - - "~>"
119
+ - !ruby/object:Gem::Version
120
+ version: '3.0'
121
+ - !ruby/object:Gem::Dependency
122
+ name: bundler
123
+ requirement: !ruby/object:Gem::Requirement
124
+ requirements:
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
128
+ type: :development
129
+ prerelease: false
130
+ version_requirements: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ - !ruby/object:Gem::Dependency
136
+ name: rake
137
+ requirement: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - "~>"
140
+ - !ruby/object:Gem::Version
141
+ version: '10.0'
142
+ type: :development
143
+ prerelease: false
144
+ version_requirements: !ruby/object:Gem::Requirement
145
+ requirements:
146
+ - - "~>"
147
+ - !ruby/object:Gem::Version
148
+ version: '10.0'
149
+ - !ruby/object:Gem::Dependency
150
+ name: rspec
151
+ requirement: !ruby/object:Gem::Requirement
152
+ requirements:
153
+ - - "~>"
154
+ - !ruby/object:Gem::Version
155
+ version: '3.0'
156
+ type: :development
157
+ prerelease: false
158
+ version_requirements: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - "~>"
161
+ - !ruby/object:Gem::Version
162
+ version: '3.0'
163
+ description: Algebraic effects.
164
+ email:
165
+ - fg@flashgordon.ru
166
+ executables: []
167
+ extensions: []
168
+ extra_rdoc_files: []
169
+ files:
170
+ - ".codeclimate.yml"
171
+ - ".gitignore"
172
+ - ".rspec"
173
+ - ".rubocop.yml"
174
+ - ".travis.yml"
175
+ - CHANGELOG.md
176
+ - CONTRIBUTING.md
177
+ - Gemfile
178
+ - LICENSE
179
+ - README.md
180
+ - Rakefile
181
+ - dry-effects.gemspec
182
+ - examples/amb.rb
183
+ - examples/state.rb
184
+ - lib/dry/effects.rb
185
+ - lib/dry/effects/all.rb
186
+ - lib/dry/effects/constructors.rb
187
+ - lib/dry/effects/container.rb
188
+ - lib/dry/effects/effect.rb
189
+ - lib/dry/effects/effects/amb.rb
190
+ - lib/dry/effects/effects/async.rb
191
+ - lib/dry/effects/effects/cache.rb
192
+ - lib/dry/effects/effects/current_time.rb
193
+ - lib/dry/effects/effects/defer.rb
194
+ - lib/dry/effects/effects/env.rb
195
+ - lib/dry/effects/effects/fork.rb
196
+ - lib/dry/effects/effects/implicit.rb
197
+ - lib/dry/effects/effects/interrupt.rb
198
+ - lib/dry/effects/effects/lock.rb
199
+ - lib/dry/effects/effects/parallel.rb
200
+ - lib/dry/effects/effects/random.rb
201
+ - lib/dry/effects/effects/reader.rb
202
+ - lib/dry/effects/effects/resolve.rb
203
+ - lib/dry/effects/effects/retry.rb
204
+ - lib/dry/effects/effects/state.rb
205
+ - lib/dry/effects/errors.rb
206
+ - lib/dry/effects/extensions.rb
207
+ - lib/dry/effects/extensions/auto_inject.rb
208
+ - lib/dry/effects/extensions/system.rb
209
+ - lib/dry/effects/halt.rb
210
+ - lib/dry/effects/handler.rb
211
+ - lib/dry/effects/inflector.rb
212
+ - lib/dry/effects/initializer.rb
213
+ - lib/dry/effects/instruction.rb
214
+ - lib/dry/effects/instructions/execute.rb
215
+ - lib/dry/effects/instructions/raise.rb
216
+ - lib/dry/effects/provider.rb
217
+ - lib/dry/effects/provider/class_interface.rb
218
+ - lib/dry/effects/providers/amb.rb
219
+ - lib/dry/effects/providers/async.rb
220
+ - lib/dry/effects/providers/cache.rb
221
+ - lib/dry/effects/providers/current_time.rb
222
+ - lib/dry/effects/providers/defer.rb
223
+ - lib/dry/effects/providers/env.rb
224
+ - lib/dry/effects/providers/fork.rb
225
+ - lib/dry/effects/providers/implicit.rb
226
+ - lib/dry/effects/providers/interrupt.rb
227
+ - lib/dry/effects/providers/lock.rb
228
+ - lib/dry/effects/providers/parallel.rb
229
+ - lib/dry/effects/providers/random.rb
230
+ - lib/dry/effects/providers/reader.rb
231
+ - lib/dry/effects/providers/resolve.rb
232
+ - lib/dry/effects/providers/retry.rb
233
+ - lib/dry/effects/providers/state.rb
234
+ - lib/dry/effects/stack.rb
235
+ - lib/dry/effects/version.rb
236
+ homepage: https://github.com/dry-rb/dry-effects
237
+ licenses:
238
+ - MIT
239
+ metadata:
240
+ allowed_push_host: https://rubygems.org
241
+ homepage_uri: https://github.com/dry-rb/dry-effects
242
+ source_code_uri: https://github.com/dry-rb/dry-effects
243
+ bug_tracker_uri: https://github.com/dry-rb/dry-effects/issues
244
+ post_install_message:
245
+ rdoc_options: []
246
+ require_paths:
247
+ - lib
248
+ required_ruby_version: !ruby/object:Gem::Requirement
249
+ requirements:
250
+ - - ">="
251
+ - !ruby/object:Gem::Version
252
+ version: '0'
253
+ required_rubygems_version: !ruby/object:Gem::Requirement
254
+ requirements:
255
+ - - ">"
256
+ - !ruby/object:Gem::Version
257
+ version: 1.3.1
258
+ requirements: []
259
+ rubygems_version: 3.0.3
260
+ signing_key:
261
+ specification_version: 4
262
+ summary: Algebraic effects.
263
+ test_files: []