Sha256: 7e5436dc7132b429ddac38a2d67f655f334a7ca01b2e4b4ecd95d28c468a7499

Contents?: true

Size: 1.94 KB

Versions: 1

Compression:

Stored size: 1.94 KB

Contents

# frozen_string_literal: true

require 'kind/version'
require 'kind/undefined'
require 'kind/optional'
require 'kind/error'
require 'kind/is'
require 'kind/checker'
require 'kind/of'
require 'kind/types'

module Kind
  def self.is; Is; end
  def self.of; Of; end

  # -- Classes
  [
    String, Symbol, Numeric, Integer, Float, Regexp, Time,
    Array, Range, Hash, Struct, Enumerator,
    Method, Proc,
    IO, File
  ].each { |klass| Types.add(klass) }

  Types.add(Queue, name: 'Queue'.freeze)

  # -- Modules
  [
    Enumerable, Comparable
  ].each { |klass| Types.add(klass) }

  # --------------------- #
  # Special type checkers #
  # --------------------- #

  module Is
    def self.Boolean(value)
      klass = Kind.of.Class(value)
      klass <= TrueClass || klass <= FalseClass
    end
  end

  module Of
    # -- Boolean

    def self.Boolean(object = Undefined, options = {})
      default = options[:or]

      return Kind::Of::Boolean if object == Undefined && default.nil?

      bool = object.nil? ? default : object

      return bool if bool.is_a?(::TrueClass) || bool.is_a?(::FalseClass)

      raise Kind::Error.new('Boolean'.freeze, bool)
    end

    const_set(:Boolean, ::Module.new do
      extend Checker

      def self.__kind; [TrueClass, FalseClass].freeze; end

      def self.class?(value); Kind.is.Boolean(value); end

      def self.instance?(value);
        value.is_a?(TrueClass) || value.is_a?(FalseClass)
      end
    end)

    # -- Lambda

    def self.Lambda(object = Undefined, options = {})
      default = options[:or]

      return Kind::Of::Lambda if object == Undefined && default.nil?

      func = object || default

      return func if func.is_a?(::Proc) && func.lambda?

      raise Kind::Error.new('Lambda'.freeze, func)
    end

    const_set(:Lambda, ::Module.new do
      extend Checker

      def self.__kind; ::Proc; end

      def self.instance?(value)
        value.is_a?(__kind) && value.lambda?
      end
    end)
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
kind-1.2.0 lib/kind.rb