dry-effects 0.4.1 → 0.5.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
  SHA256:
3
- metadata.gz: '019d3a5a4ceac14c0bf1fc045315034746b2076f82e17c8cd43d1e4d15453a73'
4
- data.tar.gz: 7c6bc85d0688ff60a98152a50f0bd27e2ee7cbd45379a33be51584bfad456c3e
3
+ metadata.gz: 626d4bdc56d537a84bf03b5dc0dc41064884a332d963927e8ea4a67146f02798
4
+ data.tar.gz: 5f2ddb0d5d4ef7be1bd6f74df8705004b0a56f777620eba2e07a5d092fd38961
5
5
  SHA512:
6
- metadata.gz: 8a900139589cf38dcdacb469021826ade7e435a9229243ae9392b76fc0cfcca6762ef48373e5a2d7b4a16f7ae51cb769c7f1de1559c92c14d8bdd3725def5932
7
- data.tar.gz: 91d5e392c86b9a91b5bef272914d4a647790606716de5722d4cccd555584bdfb33e7cdaa6fb653ffa870b33f21481fa4a057babf85131077d9a85cca65b25c6d
6
+ metadata.gz: 252fd40556632c8e54f5c4946c829c2992a37d786e14a8566dfd29ae821043f4245d85c5b4ac7c0fd611c68bd6bfb6ddcc326cb7c9025a751db965ad56464020
7
+ data.tar.gz: 3277ddb76eb1c387f840a380d9d66de4654ead45eae4fbf4b7e3708082ce7768a58740544344e1e8b9661b464d76563d72dfd24e469dbe9a7c3b1c2fdf38e692
data/CHANGELOG.md CHANGED
@@ -1,22 +1,31 @@
1
1
  <!--- DO NOT EDIT THIS FILE - IT'S AUTOMATICALLY GENERATED VIA DEVTOOLS --->
2
2
 
3
- ## 0.4.1
3
+ ## 0.5.0 2025-01-07
4
+
5
+
6
+ ### Changed
7
+
8
+ - Set minimum Ruby version to 3.1 (@flash-gordon)
9
+
10
+ [Compare v0.4.1...v0.5.0](https://github.com/dry-rb/dry-effects/compare/v0.4.1...v0.5.0)
11
+
12
+ ## 0.4.1 2024-03-15
4
13
 
5
14
 
6
15
  ### Changed
7
16
 
8
17
  - Workaround for a clash with Object#with (@tallica + @flash-gordon)
9
18
 
10
- [Compare v0.4.0...main](https://github.com/dry-rb/dry-effects/compare/v0.4.0...main)
19
+ [Compare v0.4.0...v0.4.1](https://github.com/dry-rb/dry-effects/compare/v0.4.0...v0.4.1)
11
20
 
12
- ## 0.4.0
21
+ ## 0.4.0 2022-11-07
13
22
 
14
23
 
15
24
  ### Changed
16
25
 
17
26
  - This version is compatible with recently released dry-rb dependencies (@flash-gordon)
18
27
 
19
- [Compare v0.3.1...main](https://github.com/dry-rb/dry-effects/compare/v0.3.1...main)
28
+ [Compare v0.3.1...v0.4.0](https://github.com/dry-rb/dry-effects/compare/v0.3.1...v0.4.0)
20
29
 
21
30
  ## 0.3.1 2022-10-17
22
31
 
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
  [gem]: https://rubygems.org/gems/dry-effects
3
3
  [actions]: https://github.com/dry-rb/dry-effects/actions
4
4
 
5
- # dry-effects [![Gem Version](https://badge.fury.io/rb/dry-effects.svg)][gem] [![CI Status](https://github.com/dry-rb/dry-effects/workflows/ci/badge.svg)][actions]
5
+ # dry-effects [![Gem Version](https://badge.fury.io/rb/dry-effects.svg)][gem] [![CI Status](https://github.com/dry-rb/dry-effects/workflows/CI/badge.svg)][actions]
6
6
 
7
7
  ## Links
8
8
 
@@ -14,7 +14,7 @@
14
14
 
15
15
  This library officially supports the following Ruby versions:
16
16
 
17
- * MRI `>= 3.0.0`
17
+ * MRI `>= 3.1`
18
18
  * jruby `>= 9.4` (not tested on CI)
19
19
 
20
20
  ## License
data/dry-effects.gemspec CHANGED
@@ -16,26 +16,24 @@ Gem::Specification.new do |spec|
16
16
  spec.summary = "Algebraic effects"
17
17
  spec.description = spec.summary
18
18
  spec.homepage = "https://dry-rb.org/gems/dry-effects"
19
- spec.files = Dir["CHANGELOG.md", "LICENSE", "README.md", "dry-effects.gemspec", "lib/**/*"]
19
+ spec.files = Dir["CHANGELOG.md", "LICENSE", "README.md", "dry-effects.gemspec",
20
+ "lib/**/*"]
20
21
  spec.bindir = "bin"
21
22
  spec.executables = []
22
23
  spec.require_paths = ["lib"]
23
24
 
24
- spec.metadata["allowed_push_host"] = "https://rubygems.org"
25
- spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-effects/blob/main/CHANGELOG.md"
26
- spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-effects"
27
- spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-effects/issues"
25
+ spec.metadata["allowed_push_host"] = "https://rubygems.org"
26
+ spec.metadata["changelog_uri"] = "https://github.com/dry-rb/dry-effects/blob/main/CHANGELOG.md"
27
+ spec.metadata["source_code_uri"] = "https://github.com/dry-rb/dry-effects"
28
+ spec.metadata["bug_tracker_uri"] = "https://github.com/dry-rb/dry-effects/issues"
29
+ spec.metadata["rubygems_mfa_required"] = "true"
28
30
 
29
- spec.required_ruby_version = ">= 3.0.0"
31
+ spec.required_ruby_version = ">= 3.1"
30
32
 
31
33
  # to update dependencies edit project.yml
32
- spec.add_runtime_dependency "concurrent-ruby", "~> 1.0"
33
- spec.add_runtime_dependency "dry-core", "~> 1.0"
34
- spec.add_runtime_dependency "dry-inflector", "~> 1.0"
35
- spec.add_runtime_dependency "dry-initializer", "~> 3.0"
36
- spec.add_runtime_dependency "zeitwerk", "~> 2.6"
37
-
38
- spec.add_development_dependency "bundler"
39
- spec.add_development_dependency "rake"
40
- spec.add_development_dependency "rspec"
34
+ spec.add_dependency "concurrent-ruby", "~> 1.0"
35
+ spec.add_dependency "dry-core", "~> 1.1"
36
+ spec.add_dependency "dry-inflector", "~> 1.1"
37
+ spec.add_dependency "dry-initializer", "~> 3.2"
38
+ spec.add_dependency "zeitwerk", "~> 2.6"
41
39
  end
@@ -21,12 +21,11 @@ module Dry
21
21
  end
22
22
 
23
23
  singleton_class.class_eval do
24
- define_method(class_name) do |*args|
25
- effect_modules.fetch_or_store([key, args]) do
26
- ::Dry::Effects.effects[key].new(*args).freeze
24
+ define_method(class_name) do |*args, **kwargs|
25
+ effect_modules.fetch_or_store([key, args, kwargs]) do
26
+ ::Dry::Effects.effects[key].new(*args, **kwargs).freeze
27
27
  end
28
28
  end
29
- ruby2_keywords(class_name) if respond_to?(:ruby2_keywords, true)
30
29
  end
31
30
  end
32
31
 
@@ -18,14 +18,10 @@ module Dry
18
18
  end
19
19
 
20
20
  # @api public
21
- def Retry(scope)
22
- Effects::Retry::Retry.new(type: :retry, scope: scope)
23
- end
21
+ def Retry(scope) = Effects::Retry::Retry.new(type: :retry, scope: scope)
24
22
 
25
23
  # @api public
26
- def Read(scope)
27
- Effects::State::State.new(type: :state, name: :read, scope: scope)
28
- end
24
+ def Read(scope) = Effects::State::State.new(type: :state, name: :read, scope: scope)
29
25
 
30
26
  # @api public
31
27
  def Write(scope, value)
@@ -20,9 +20,7 @@ module Dry
20
20
  ::Dry::Effects.yield(timeout)
21
21
  end
22
22
 
23
- def timed_out?
24
- timeout.zero?
25
- end
23
+ def timed_out? = timeout.zero?
26
24
  end
27
25
  end
28
26
  end
@@ -9,7 +9,7 @@ begin
9
9
  rescue LoadError
10
10
  ActiveSupport::TaggedLogging::Formatter.prepend(Module.new {
11
11
  def current_tags
12
- thread_key = @thread_key ||= "activesupport_tagged_logging_tags:#{object_id}"
12
+ thread_key = @thread_key ||= "activesupport_tagged_logging_tags:#{__id__}"
13
13
  unless Thread.current.thread_variable_get(thread_key)
14
14
  Thread.current.thread_variable_set(thread_key, [])
15
15
  end
@@ -53,9 +53,7 @@ module Dry
53
53
  class Dynamic < Static
54
54
  private
55
55
 
56
- def define_readers(dynamic: true)
57
- super
58
- end
56
+ def define_readers(dynamic: true) = super
59
57
  end
60
58
 
61
59
  register :static, Static
@@ -7,15 +7,11 @@
7
7
  RSpec::Support.singleton_class.prepend(Module.new {
8
8
  include Dry::Effects.Reader(:rspec, as: :effect_local_data)
9
9
 
10
- def thread_local_data
11
- effect_local_data { super }
12
- end
10
+ def thread_local_data = effect_local_data { super }
13
11
  })
14
12
 
15
13
  RSpec::Core::Runner.prepend(Module.new {
16
14
  include Dry::Effects::Handler.Reader(:rspec, as: :run_with_data)
17
15
 
18
- def run_specs(*)
19
- run_with_data(RSpec::Support.thread_local_data) { super }
20
- end
16
+ def run_specs(*) = run_with_data(RSpec::Support.thread_local_data) { super }
21
17
  })
@@ -23,7 +23,7 @@ module Dry
23
23
 
24
24
  def self.injector(effects: true, **kwargs)
25
25
  if effects
26
- Dry::Effects.AutoInject(**kwargs)
26
+ ::Dry::Effects.AutoInject(**kwargs)
27
27
  else
28
28
  super()
29
29
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "fiber"
4
-
5
3
  module Dry
6
4
  module Effects
7
5
  # Stack frame
@@ -6,22 +6,20 @@ module Dry
6
6
  # @api private
7
7
  module DefineWithHook
8
8
  # @api private
9
- def param(*)
9
+ def param(...)
10
10
  super.tap do
11
11
  @params_arity = nil
12
12
  __define_with__
13
13
  end
14
14
  end
15
- ruby2_keywords(:param) if respond_to?(:ruby2_keywords, true)
16
15
 
17
16
  # @api private
18
- def option(*)
17
+ def option(...)
19
18
  super.tap do
20
19
  __define_with__ unless method_defined?(:with)
21
20
  @has_options = true
22
21
  end
23
22
  end
24
- ruby2_keywords(:option) if respond_to?(:ruby2_keywords, true)
25
23
 
26
24
  # @api private
27
25
  def params_arity
@@ -11,9 +11,7 @@ module Dry
11
11
  @block = block
12
12
  end
13
13
 
14
- def call
15
- block.call
16
- end
14
+ def call = block.call
17
15
  end
18
16
  end
19
17
  end
@@ -11,9 +11,7 @@ module Dry
11
11
  @error = error
12
12
  end
13
13
 
14
- def call
15
- raise error
16
- end
14
+ def call = raise error
17
15
  end
18
16
  end
19
17
  end
@@ -29,9 +29,7 @@ module Dry
29
29
  # @param [Effect] effect
30
30
  # @return [Boolean]
31
31
  # @api public
32
- def provide?(effect)
33
- super && scope.eql?(effect.scope)
34
- end
32
+ def provide?(effect) = super && scope.eql?(effect.scope)
35
33
 
36
34
  # @return [String]
37
35
  # @api public
@@ -10,9 +10,7 @@ module Dry
10
10
 
11
11
  param :id
12
12
 
13
- def get
14
- value
15
- end
13
+ def get = value
16
14
 
17
15
  # Yield the block with the handler installed
18
16
  #
@@ -33,15 +31,11 @@ module Dry
33
31
  # @param [Effect] effect
34
32
  # @return [Boolean]
35
33
  # @api public
36
- def provide?(effect)
37
- super && id.equal?(effect.id)
38
- end
34
+ def provide?(effect) = super && id.equal?(effect.id)
39
35
 
40
36
  # @return [String]
41
37
  # @api public
42
- def represent
43
- "cmp[#{id}=#{@value}]"
44
- end
38
+ def represent = "cmp[#{id}=#{@value}]"
45
39
  end
46
40
  end
47
41
  end
@@ -44,9 +44,7 @@ module Dry
44
44
  #
45
45
  # @return [Provider]
46
46
  # @api private
47
- def locate
48
- self
49
- end
47
+ def locate = self
50
48
 
51
49
  # @return [String]
52
50
  # @api public
@@ -12,9 +12,7 @@ module Dry
12
12
 
13
13
  attr_reader :parent
14
14
 
15
- def read(key)
16
- parent.fetch(key) { fetch(key) }
17
- end
15
+ def read(key) = parent.fetch(key) { fetch(key) }
18
16
 
19
17
  def fetch(key)
20
18
  values.fetch(key) do
@@ -31,9 +29,7 @@ module Dry
31
29
  #
32
30
  # @return [Provider]
33
31
  # @api private
34
- def locate
35
- self
36
- end
32
+ def locate = self
37
33
 
38
34
  # Yield the block with the handler installed
39
35
  #
@@ -12,9 +12,7 @@ module Dry
12
12
 
13
13
  attr_reader :dictionary
14
14
 
15
- def implicit(arg)
16
- dictionary.fetch(arg.class)
17
- end
15
+ def implicit(arg) = dictionary.fetch(arg.class)
18
16
 
19
17
  # Yield the block with the handler installed
20
18
  #
@@ -6,9 +6,7 @@ module Dry
6
6
  class Interrupt < Provider[:interrupt]
7
7
  param :scope, default: -> { :default }
8
8
 
9
- def interrupt(*payload)
10
- Instructions.Raise(halt.new(payload))
11
- end
9
+ def interrupt(*payload) = Instructions.Raise(halt.new(payload))
12
10
 
13
11
  # Yield the block with the handler installed
14
12
  #
@@ -19,22 +17,16 @@ module Dry
19
17
  [true, e.payload[0]]
20
18
  end
21
19
 
22
- def halt
23
- Halt[scope]
24
- end
20
+ def halt = Halt[scope]
25
21
 
26
22
  # @return [String]
27
23
  # @api public
28
- def represent
29
- "interrupt[#{scope}]"
30
- end
24
+ def represent = "interrupt[#{scope}]"
31
25
 
32
26
  # @param [Effect] effect
33
27
  # @return [Boolean]
34
28
  # @api public
35
- def provide?(effect)
36
- super && scope.equal?(effect.scope)
37
- end
29
+ def provide?(effect) = super && scope.equal?(effect.scope)
38
30
  end
39
31
  end
40
32
  end
@@ -31,9 +31,7 @@ module Dry
31
31
  end
32
32
  end
33
33
 
34
- def locked?(key)
35
- locks.key?(key)
36
- end
34
+ def locked?(key) = locks.key?(key)
37
35
 
38
36
  def unlock(handle)
39
37
  mutex.synchronize do
@@ -62,25 +60,17 @@ module Dry
62
60
  locked
63
61
  end
64
62
 
65
- def locked?(key)
66
- backend.locked?(key)
67
- end
63
+ def locked?(key) = backend.locked?(key)
68
64
 
69
- def unlock(handle)
70
- backend.unlock(handle)
71
- end
65
+ def unlock(handle) = backend.unlock(handle)
72
66
 
73
- def meta(key)
74
- backend.meta(key)
75
- end
67
+ def meta(key) = backend.meta(key)
76
68
 
77
69
  # Locate handler in the stack
78
70
  #
79
71
  # @return [Provider]
80
72
  # @api private
81
- def locate
82
- self
83
- end
73
+ def locate = self
84
74
 
85
75
  # Yield the block with the handler installed
86
76
  #
@@ -21,9 +21,7 @@ module Dry
21
21
  end
22
22
  end
23
23
 
24
- def join(xs)
25
- xs.map(&:value!)
26
- end
24
+ def join(xs) = xs.map(&:value!)
27
25
 
28
26
  # Yield the block with the handler installed
29
27
  #
@@ -28,9 +28,7 @@ module Dry
28
28
  @state = Undefined
29
29
  end
30
30
 
31
- def read
32
- state
33
- end
31
+ def read = state
34
32
 
35
33
  # Yield the block with the handler installed
36
34
  #
@@ -39,9 +39,7 @@ module Dry
39
39
  #
40
40
  # @return [Provider]
41
41
  # @api private
42
- def locate
43
- self
44
- end
42
+ def locate = self
45
43
 
46
44
  # Yield the block with the handler installed
47
45
  #
@@ -25,9 +25,7 @@ module Dry
25
25
  end
26
26
  end
27
27
 
28
- def retry
29
- Instructions.Raise(halt.new)
30
- end
28
+ def retry = Instructions.Raise(halt.new)
31
29
 
32
30
  def attempt
33
31
  if attempts_exhausted?
@@ -42,19 +40,13 @@ module Dry
42
40
  attempts.equal?(limit)
43
41
  end
44
42
 
45
- def halt
46
- Halt[scope]
47
- end
43
+ def halt = Halt[scope]
48
44
 
49
- def provide?(effect)
50
- super && scope.equal?(effect.scope)
51
- end
45
+ def provide?(effect) = super && scope.equal?(effect.scope)
52
46
 
53
47
  # @return [String]
54
48
  # @api public
55
- def represent
56
- "retry[#{scope} #{attempts}/#{limit}]"
57
- end
49
+ def represent = "retry[#{scope} #{attempts}/#{limit}]"
58
50
  end
59
51
  end
60
52
  end
@@ -36,9 +36,7 @@ module Dry
36
36
  effect.type.equal?(:timeout) && scope.equal?(effect.scope)
37
37
  end
38
38
 
39
- def read_clock
40
- ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
41
- end
39
+ def read_clock = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
42
40
  end
43
41
  end
44
42
  end
@@ -38,9 +38,7 @@ module Dry
38
38
  #
39
39
  # @return [Provider]
40
40
  # @api private
41
- def locate
42
- self
43
- end
41
+ def locate = self
44
42
 
45
43
  private
46
44
 
@@ -34,8 +34,8 @@ module Dry
34
34
  find { _1.provide?(effect) }
35
35
  end
36
36
 
37
- def each(&block)
38
- providers.each(&block)
37
+ def each(&)
38
+ providers.each(&)
39
39
  end
40
40
 
41
41
  def size
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Dry
4
4
  module Effects
5
- VERSION = "0.4.1"
5
+ VERSION = "0.5.0"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dry-effects
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nikita Shilnikov
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-03-15 00:00:00.000000000 Z
11
+ date: 2025-01-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -30,42 +30,42 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.0'
33
+ version: '1.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.0'
40
+ version: '1.1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: dry-inflector
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '1.0'
47
+ version: '1.1'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '1.0'
54
+ version: '1.1'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: dry-initializer
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '3.0'
61
+ version: '3.2'
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '3.0'
68
+ version: '3.2'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: zeitwerk
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,48 +80,6 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '2.6'
83
- - !ruby/object:Gem::Dependency
84
- name: bundler
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ">="
88
- - !ruby/object:Gem::Version
89
- version: '0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ">="
95
- - !ruby/object:Gem::Version
96
- version: '0'
97
- - !ruby/object:Gem::Dependency
98
- name: rake
99
- requirement: !ruby/object:Gem::Requirement
100
- requirements:
101
- - - ">="
102
- - !ruby/object:Gem::Version
103
- version: '0'
104
- type: :development
105
- prerelease: false
106
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
108
- - - ">="
109
- - !ruby/object:Gem::Version
110
- version: '0'
111
- - !ruby/object:Gem::Dependency
112
- name: rspec
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - ">="
116
- - !ruby/object:Gem::Version
117
- version: '0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - ">="
123
- - !ruby/object:Gem::Version
124
- version: '0'
125
83
  description: Algebraic effects
126
84
  email:
127
85
  - fg@flashgordon.ru
@@ -203,7 +161,8 @@ metadata:
203
161
  changelog_uri: https://github.com/dry-rb/dry-effects/blob/main/CHANGELOG.md
204
162
  source_code_uri: https://github.com/dry-rb/dry-effects
205
163
  bug_tracker_uri: https://github.com/dry-rb/dry-effects/issues
206
- post_install_message:
164
+ rubygems_mfa_required: 'true'
165
+ post_install_message:
207
166
  rdoc_options: []
208
167
  require_paths:
209
168
  - lib
@@ -211,15 +170,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
211
170
  requirements:
212
171
  - - ">="
213
172
  - !ruby/object:Gem::Version
214
- version: 3.0.0
173
+ version: '3.1'
215
174
  required_rubygems_version: !ruby/object:Gem::Requirement
216
175
  requirements:
217
176
  - - ">="
218
177
  - !ruby/object:Gem::Version
219
178
  version: '0'
220
179
  requirements: []
221
- rubygems_version: 3.3.26
222
- signing_key:
180
+ rubygems_version: 3.3.27
181
+ signing_key:
223
182
  specification_version: 4
224
183
  summary: Algebraic effects
225
184
  test_files: []