Sha256: 77a70cd4f317926b6afee572efe6043f471460989a566eca0806cccc49cbde08

Contents?: true

Size: 920 Bytes

Versions: 3

Compression:

Stored size: 920 Bytes

Contents

# frozen_string_literal: true

require 'sums_up/core/functions'
require 'sums_up/core/matcher'
require 'sums_up/core/parser'
require 'sums_up/core/strings'
require 'sums_up/core/sum_type'
require 'sums_up/core/variant'

module SumsUp
  # Core functionality which builds modules for sum types and classes for
  # variants.
  module Core
    module_function

    def define(*no_arg_variants, **arg_variants, &block)
      variant_specs = Parser.parse_variant_specs!(no_arg_variants, arg_variants)
      variant_names = variant_specs.keys

      variant_classes = variant_specs.map do |name, members|
        others = variant_names - [name]
        matcher_class = Matcher.build_matcher_class(name, others)

        Variant.build_variant_class(name, others, members, matcher_class)
      end

      SumType
        .build(variant_classes)
        .tap { |sum_type| sum_type.module_eval(&block) if block }
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
sums_up-1.2.0 lib/sums_up/core.rb
sums_up-1.1.0 lib/sums_up/core.rb
sums_up-1.0.0 lib/sums_up/core.rb