Module: JSI::Util

Included in:
JSI
Defined in:
lib/jsi/util.rb

Overview

JSI::Util classes, modules, constants, and methods are INTERNAL and will be added and removed without warning. do not rely on them.

Defined Under Namespace

Modules: FingerprintHash, Memoize

Constant Summary collapse

NOOP =

a proc which does nothing

-> (*_) { }

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.ycombObject

this is the Y-combinator, which allows anonymous recursive functions. for a simple example, to define a recursive function to return the length of an array:

length = ycomb do |len| proc { |list| list == [] ? 0 : 1 + len.call(list[1..-1]) } end

see https://secure.wikimedia.org/wikipedia/en/wiki/Fixed_point_combinator#Y_combinator and chapter 9 of the little schemer, available as the sample chapter at http://www.ccs.neu.edu/home/matthias/BTLS/



66
67
68
# File 'lib/jsi/util.rb', line 66

def ycomb
  proc { |f| f.call(f) }.call(proc { |f| yield proc { |*x| f.call(f).call(*x) } })
end

Instance Method Details

#deep_stringify_symbol_keys(object) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/jsi/util.rb', line 37

def deep_stringify_symbol_keys(object)
  if object.respond_to?(:to_hash)
    JSI::Typelike.modified_copy(object) do |hash|
      out = {}
      (hash.respond_to?(:each) ? hash : hash.to_hash).each do |k, v|
        out[k.is_a?(Symbol) ? k.to_s : deep_stringify_symbol_keys(k)] = deep_stringify_symbol_keys(v)
      end
      out
    end
  elsif object.respond_to?(:to_ary)
    JSI::Typelike.modified_copy(object) do |ary|
      (ary.respond_to?(:each) ? ary : ary.to_ary).map do |e|
        deep_stringify_symbol_keys(e)
      end
    end
  else
    object
  end
end

#stringify_symbol_keys(hashlike) ⇒ same class as the param `hash`, or Hash if the former cannot be done

returns a version of the given hash, in which any symbol keys are converted to strings. behavior on collisions is undefined (but in the future could take a block like ActiveSupport::HashWithIndifferentAccess#update)

at the moment it is undefined whether the returned hash is the same instance as the hash param. if hash is already a hash which contains no symbol keys, this method MAY return that same instance. use #dup on the return if you need to ensure it is not the same instance as the argument instance.

Parameters:

  • hashlike (#to_hash)

    the hash from which to convert symbol keys to strings

Returns:

  • (same class as the param `hash`, or Hash if the former cannot be done)

    a hash(-like) instance containing no symbol keys



24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/jsi/util.rb', line 24

def stringify_symbol_keys(hashlike)
  unless hashlike.respond_to?(:to_hash)
    raise(ArgumentError, "expected argument to be a hash; got #{hashlike.class.inspect}: #{hashlike.pretty_inspect.chomp}")
  end
  JSI::Typelike.modified_copy(hashlike) do |hash|
    out = {}
    hash.each do |k, v|
      out[k.is_a?(Symbol) ? k.to_s : k] = v
    end
    out
  end
end