Matchete
Matchete provides a DSL for method overloading based on pattern matching for Ruby.
It's just a quick hack inspired by weissbier and the use-return-values-of-method-definitions DSL technique used in harmonic
Install
gem install matchete
Usage
require 'matchete'
class FactorialStrikesAgain
include Matchete
on 1,
def factorial(value)
1
end
on -> x { x > 1 },
def factorial(value)
value * factorial(value - 1)
end
end
FactorialStrikesAgain.new.factorial(4) #24
FactorialStrikesAgain.new.factorial(-2) #Matchete::NotResolvedError No matching factorial method for args [-2]
require 'matchete'
class Converter
include Matchete
on Integer,
def convert(value)
[:integer, value]
end
on Hash,
def convert(values)
[:dict, values.map { |k, v| [convert(k), convert(v)] }]
end
on /reserved_/,
def convert(value)
[:reserved_symbol, value]
end
on String,
def convert(value)
[:string, value]
end
on ['deleted', [Integer, Any]],
def convert(value)
['deleted', value[1]]
end
on :not_implemented?,
def convert(value)
[:fail, value]
end
on free: Integer, method:
def convert(free:)
[:rofl, free]
end
default def convert(value)
[:z, value]
end
def not_implemented?(value)
value.is_a? Symbol
end
end
converter = Converter.new
p converter.convert(2) #[:integer, 2]
p converter.convert({2 => 4}) #[:dict, [[[:integer, 2], [:integer, 4]]]
p converter.convert('reserved_l') #[;reserved_symbol, 'l']
p converter.convert('zaza') #[:string, 'zaza']
p converter.convert(['deleted', [2, Array]]) #['deleted', [2, Array]]
p converter.convert(:f) #[:fail, :f]
p converter.convert(free: 2) #[:rofl, 2]
p converter.convert(2.2) #[:z, 2.2]
Todo
Copyright
Copyright (c) 2014 Alexander Ivanov. See LICENSE for further details.