# encoding: utf-8 module Origin module Extensions # This module contains additional hash behaviour. module Hash # Add an object to a hash using the merge strategies. # # @example Add an object to a hash. # { field: value }.__add__({ field: other_value }) # # @param [ Hash ] object The other hash to add. # # @return [ Hash ] The hash with object added. # # @since 1.0.0 def __add__(object) apply_strategy(:__add__, object) end # Merge this hash into the provided array. # # @example Merge the hash into the array. # { field: value }.__add_from_array__([ 1, 2 ]) # # @param [ Array ] value The array to add to. # # @return [ Hash ] The merged hash. # # @since 1.0.0 def __add_from_array__(array) { keys.first => array.__add__(values.first) } end # Add an object to a hash using the merge strategies. # # @example Add an object to a hash. # { field: value }.__intersect__({ field: other_value }) # # @param [ Hash ] object The other hash to intersect. # # @return [ Hash ] The hash with object intersected. # # @since 1.0.0 def __intersect__(object) apply_strategy(:__intersect__, object) end # Merge this hash into the provided array. # # @example Merge the hash into the array. # { field: value }.__intersect_from_array__([ 1, 2 ]) # # @param [ Array ] value The array to intersect to. # # @return [ Hash ] The merged hash. # # @since 1.0.0 def __intersect_from_array__(array) { keys.first => array.__intersect__(values.first) } end # Merge this hash into the provided object. # # @example Merge the hash into the object. # { field: value }.__intersect_from_object__([ 1, 2 ]) # # @param [ Object ] value The object to intersect to. # # @return [ Hash ] The merged hash. # # @since 1.0.0 def __intersect_from_object__(object) { keys.first => object.__intersect__(values.first) } end # Add an object to a hash using the merge strategies. # # @example Add an object to a hash. # { field: value }.__union__({ field: other_value }) # # @param [ Hash ] object The other hash to union. # # @return [ Hash ] The hash with object unioned. # # @since 1.0.0 def __union__(object) apply_strategy(:__union__, object) end # Merge this hash into the provided object. # # @example Merge the hash into the object. # { field: value }.__union_from_object__([ 1, 2 ]) # # @param [ Object ] value The object to union to. # # @return [ Hash ] The merged hash. # # @since 1.0.0 def __union_from_object__(object) { keys.first => object.__union__(values.first) } end # Make a deep copy of this hash. # # @example Make a deep copy of the hash. # { field: value }.__deep_copy__ # # @return [ Hash ] The copied hash. # # @since 1.0.0 def __deep_copy__ {}.tap do |copy| each_pair do |key, value| copy.store(key, value.__deep_copy__) end end end # Get the hash as a sort option. # # @example Get the hash as a sort option. # { field: 1 }.__sort_option__ # # @return [ Hash ] The hash as sort option. # # @since 1.0.0 def __sort_option__ tap do |hash| hash.each_pair do |key, value| hash.store(key, value.to_direction) end end end # Get the object as expanded. # # @example Get the object expanded. # obj.__expand_complex__ # # @return [ Hash ] The expanded hash. # # @since 1.0.5 def __expand_complex__ replacement = {} each_pair do |key, value| replacement.merge!(key.__expr_part__(value.__expand_complex__)) end replacement end # Update all the values in the hash with the provided block. # # @example Update the values in place. # { field: "1" }.update_values(&:to_i) # # @param [ Proc ] block The block to execute on each value. # # @return [ Hash ] the hash. # # @since 1.0.0 def update_values(&block) each_pair do |key, value| store(key, block[value]) end end private # Apply the provided strategy for the hash with the given object. # # @api private # # @example Apply the strategy. # { field: value }.apply_strategy(:__add__, 1) # # @param [ Symbol ] strategy The strategy to apply. # @param [ Object ] object The object to merge. # # @return [ Hash ] The merged hash. # # @since 1.0.0 def apply_strategy(strategy, object) tap do |hash| object.each_pair do |key, value| hash.store(key, hash[key].send(strategy, value)) end end end end end end ::Hash.__send__(:include, Origin::Extensions::Hash)