Sha256: 3df2b82c7b0c66047ad1f6b356d50af53ebfb07746d2fed943c07f317188151b

Contents?: true

Size: 1.4 KB

Versions: 2

Compression:

Stored size: 1.4 KB

Contents

module Bmg
  class TupleTransformer

    def initialize(transformation)
      @transformation = transformation
    end

    def self.new(arg)
      return arg if arg.is_a?(TupleTransformer)
      super
    end

    def call(tuple)
      transform_tuple(tuple, @transformation)
    end

    def knows_attrlist?
      @transformation.is_a?(Hash)
    end

    def to_attrlist
      @transformation.keys
    end

    private

      def transform_tuple(tuple, with)
        case with
        when Symbol
          tuple.each_with_object({}){|(k,v),dup|
            dup[k] = transform_attr(v, with)
          }
        when Proc
          tuple.each_with_object({}){|(k,v),dup|
            dup[k] = transform_attr(v, with)
          }
        when Hash
          with.each_with_object(tuple.dup){|(k,v),dup|
            dup[k] = transform_attr(dup[k], v)
          }
        when Array
          with.inject(tuple){|dup,on|
            transform_tuple(dup, on)
          }
        else
          raise ArgumentError, "Unexpected transformation `#{with.inspect}`"
        end
      end

      def transform_attr(value, with)
        case with
        when Symbol
          value.send(with)
        when Proc
          with.call(value)
        when Hash
          with[value]
        else
          raise ArgumentError, "Unexpected transformation `#{with.inspect}`"
        end
      end

  end # module TupleTransformer
end # module Bmg

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
bmg-0.17.8 lib/bmg/support/tuple_transformer.rb
bmg-0.17.7 lib/bmg/support/tuple_transformer.rb