Sha256: b0cce72bd2aa46aaaffd145ef21c6449559f547f1b72ab21201e0f5b317da540

Contents?: true

Size: 1.21 KB

Versions: 4

Compression:

Stored size: 1.21 KB

Contents

# frozen_string_literal: true

module Dry
  module Effects
    module Effects
      class Lock < ::Module
        Lock = Effect.new(type: :lock, name: :lock)
        Meta = Effect.new(type: :lock, name: :meta)
        Unlock = Effect.new(type: :lock, name: :unlock)
        Locked = Effect.new(type: :lock, name: :locked?)

        def initialize
          super

          module_eval do
            define_method(:lock) do |key, meta: Undefined, &block|
              if block
                begin
                  handle = ::Dry::Effects.yield(Lock.payload(key, meta))
                  block.(!handle.nil?)
                ensure
                  ::Dry::Effects.yield(Unlock.payload(handle)) if handle
                end
              else
                ::Dry::Effects.yield(Lock.payload(key, meta))
              end
            end

            define_method(:unlock) do |key|
              ::Dry::Effects.yield(Unlock.(key))
            end

            define_method(:locked?) do |key|
              ::Dry::Effects.yield(Locked.payload(key))
            end

            define_method(:lock_meta) do |key|
              ::Dry::Effects.yield(Meta.payload(key))
            end
          end
        end
      end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
dry-effects-0.5.0 lib/dry/effects/effects/lock.rb
dry-effects-0.4.1 lib/dry/effects/effects/lock.rb
dry-effects-0.4.0 lib/dry/effects/effects/lock.rb
dry-effects-0.3.1 lib/dry/effects/effects/lock.rb