Sha256: c9fc433036d993fcd724d1e10d7e691294314b7459dc492499b4ca49f8247b61

Contents?: true

Size: 1.18 KB

Versions: 37

Compression:

Stored size: 1.18 KB

Contents

require 'active_support/core_ext/class/attribute'
require 'active_support/core_ext/string/inflections'
require 'active_support/hash_with_indifferent_access'
require 'parallel'

module TogoStanza::Stanza
  class ExpressionMap < HashWithIndifferentAccess
    module Macro
      def define_expression_map(name)
        class_attribute name

        __send__ "#{name}=", ExpressionMap.new

        define_singleton_method name.to_s.singularize do |key, val = nil, &block|
          raise ArgumentError, 'You must specify exactly one of either a value or block' unless [val, block].one?(&:nil?)

          __send__ "#{name}=", __send__(name).merge(key => block || val)
        end
      end
    end

    def resolve(context, key, params)
      val = self[key]

      return val unless val.respond_to?(:call)

      args = val.parameters.reject {|type, _|
        type == :block
      }.map {|_, key|
        params[key]
      }

      context.instance_exec(*args, &val)
    end

    def resolve_all_in_parallel(context, params)
      Parallel.map(self, in_threads: 16) {|k, v|
        [k, resolve(context, k, params)]
      }.each_with_object({}) {|(k, v), memo|
        memo[k] = v
      }
    end
  end
end

Version data entries

37 entries across 37 versions & 1 rubygems

Version Path
togostanza-2.2.2 lib/togostanza/stanza/expression_map.rb
togostanza-2.2.1 lib/togostanza/stanza/expression_map.rb
togostanza-2.2.0 lib/togostanza/stanza/expression_map.rb
togostanza-2.1.3 lib/togostanza/stanza/expression_map.rb
togostanza-2.1.2 lib/togostanza/stanza/expression_map.rb
togostanza-2.1.1 lib/togostanza/stanza/expression_map.rb
togostanza-2.1.0 lib/togostanza/stanza/expression_map.rb
togostanza-2.0.0 lib/togostanza/stanza/expression_map.rb
togostanza-1.5.0 lib/togostanza/stanza/expression_map.rb
togostanza-1.4.1 lib/togostanza/stanza/expression_map.rb
togostanza-1.4.0 lib/togostanza/stanza/expression_map.rb
togostanza-1.3.3 lib/togostanza/stanza/expression_map.rb
togostanza-1.3.2 lib/togostanza/stanza/expression_map.rb
togostanza-1.3.1 lib/togostanza/stanza/expression_map.rb
togostanza-1.3.0 lib/togostanza/stanza/expression_map.rb
togostanza-1.2.2 lib/togostanza/stanza/expression_map.rb
togostanza-1.2.1 lib/togostanza/stanza/expression_map.rb
togostanza-1.2.0 lib/togostanza/stanza/expression_map.rb
togostanza-1.1.0 lib/togostanza/stanza/expression_map.rb
togostanza-1.0.6 lib/togostanza/stanza/expression_map.rb