Sha256: 5537b509e9fafe003b39db6622538b339fc02b3b94a948c03df445d20a73868a

Contents?: true

Size: 1.25 KB

Versions: 1

Compression:

Stored size: 1.25 KB

Contents

# frozen_string_literal: true

require 'concurrent/map'
require 'dry/effects'
require 'dry/effects/inflector'

module Dry
  module Effects
    default = %i[
      cache current_time random resolve defer
      state interrupt amb retry fork parallel
      async implicit env lock reader timestamp
    ]

    effect_modules = ::Concurrent::Map.new

    default.each do |key|
      class_name = Inflector.camelize(key)

      if ::File.exist?("#{__dir__}/effects/#{key}.rb")
        effects.register(key, memoize: true) do
          require "dry/effects/effects/#{key}"
          Effects.const_get(Inflector.camelize(key))
        end

        singleton_class.class_eval do
          define_method(class_name) do |*args|
            effect_modules.fetch_or_store([key, args]) do
              ::Dry::Effects.effects[key].new(*args).freeze
            end
          end
        end
      end

      if ::File.exists?("#{__dir__}/providers/#{key}.rb")
        providers.register(key, memoize: true) do
          require "dry/effects/providers/#{key}"
          Providers.const_get(Inflector.camelize(key))
        end

        Handler.singleton_class.send(:define_method, class_name) do |*args|
          ::Dry::Effects.providers[key].mixin(*args)
        end
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dry-effects-0.1.0.alpha2 lib/dry/effects/all.rb