lib/kind.rb in kind-1.2.0 vs lib/kind.rb in kind-1.3.0

- old
+ new

@@ -35,10 +35,14 @@ module Is def self.Boolean(value) klass = Kind.of.Class(value) klass <= TrueClass || klass <= FalseClass end + + def self.Callable(value) + value.respond_to?(:call) || (value.is_a?(Module) && value.public_instance_methods.include?(:call)) + end end module Of # -- Boolean @@ -85,9 +89,35 @@ def self.__kind; ::Proc; end def self.instance?(value) value.is_a?(__kind) && value.lambda? + end + end) + + # -- Callable + + def self.Callable(object = Undefined, options = {}) + default = options[:or] + + return Kind::Of::Callable if object == Undefined && default.nil? + + callable = object.nil? ? default : object + + return callable if callable.respond_to?(:call) + + raise Kind::Error.new('Callable'.freeze, callable) + end + + const_set(:Callable, ::Module.new do + extend Checker + + def self.__kind; Object; end + + def self.class?(value); Kind::Is::Callable(value); end + + def self.instance?(value); + value.respond_to?(:call) end end) end end