Skip to content

Instantly share code, notes, and snippets.

@monorkin
Last active October 21, 2019 19:23
Show Gist options
  • Save monorkin/7e1a597afb0ad295d5b8ecfb951d60af to your computer and use it in GitHub Desktop.
Save monorkin/7e1a597afb0ad295d5b8ecfb951d60af to your computer and use it in GitHub Desktop.
# Copyright 2018 Stanko K.R. <me@stanko.io>
#
# Permission is hereby granted, free of charge, to any
# person obtaining a copy of this software and associated
# documentation files (the "Software"), to deal in the
# Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute,
# sublicense, and/or sell copies of the Software, and to permit
# persons to whom the Software is furnished to do so, subject
# to the following conditions:
#
# The above copyright notice and this permission notice shall
# be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
# This module returns the method of a given class,
# module or object
#
# ```ruby
# require 'json'
# M[JSON].parse # => #<Method: JSON.parse>
# ```
# I would prefere if I could name `M` `&`
# instead and get the following syntax
# `&[JSON].parse`, but this isn't possible
# as far as I'm aware
module M
class MethodExtractor
def initialize(parent)
@parent = parent
end
protected
attr_reader :parent
private
def method_missing(method_name)
parent.method(method_name)
end
end
def self.[](parent)
MethodExtractor.new(parent)
end
end
# This module exposes a top-level `map` method thet's
# easy to compose with other functions.
#
# ```ruby
# t =
# Enum.map { |x| x + 2 } \
# >> Enum.map { |x| x * 2 }
# t.call([1, 2, 3]) # => [6, 8, 10]
# ```
module Enum
def self.map(&block)
-> enum { enum.map(&block) }
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment