Sha256: 9f9f3529653d5621cbcbe0547360185dccc683ccdaf5c6cbecd6e8b35b0f2490

Contents?: true

Size: 1.53 KB

Versions: 1

Compression:

Stored size: 1.53 KB

Contents

# frozen_string_literal: true

require 'concurrent/map'

module Dry
  # Common, idiomatic monads for Ruby
  #
  # @api private
  module Monads
    @registry = {}
    @constructors = nil
    @paths = {
      do: 'dry/monads/do/all',
      lazy: 'dry/monads/lazy',
      list: 'dry/monads/list',
      maybe: 'dry/monads/maybe',
      task: 'dry/monads/task',
      try: 'dry/monads/try',
      validated: 'dry/monads/validated',
      result: [
        'dry/monads/result',
        'dry/monads/result/fixed'
      ]
    }.freeze
    @mixins = Concurrent::Map.new

    class << self
      private

      attr_reader :registry

      def registry=(registry)
        @constructors = nil
        @registry = registry.dup.freeze
      end
      protected :registry=

      # @private
      def register_mixin(name, mod)
        if registry.key?(name)
          raise ArgumentError, "#{name.inspect} is already registered"
        end

        self.registry = registry.merge(name => mod)
      end

      # @private
      def known_monads
        @paths.keys
      end

      # @private
      def load_monad(name)
        path = @paths.fetch(name) {
          raise ArgumentError, "#{name.inspect} is not a known monad"
        }
        Array(path).each { |p| require p }
      end

      # @private
      def constructors
        @constructors ||= registry.values.map { |m|
          m::Constructors if m.const_defined?(:Constructors)
        }.compact
      end

      # @private
      def all_loaded?
        registry.size == @paths.size
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
dry-monads-1.3.5 lib/dry/monads/registry.rb