Sha256: fc29ddc7dd1baa649c44508ed8445b9346ff2093a8516a493e6e60f1e7a0bbfb

Contents?: true

Size: 905 Bytes

Versions: 2

Compression:

Stored size: 905 Bytes

Contents

# typed: strict
# frozen_string_literal: true

module Muina
  # Result Monad
  class Result < Value
    # Typed Results Factory.
    class Factory < T::Struct
      prop :success_klass, T.any(Classes, T::Types::Base)
      prop :error_klass,   T.any(Classes, T::Types::Base)

      def success(value)
        success_subclass.__send__(:new, value: value)
      end

      def failure(error)
        failure_subclass.__send__(:new, error: error)
      end

      private

      def success_subclass
        klass_factory(Success, :value, success_klass)
      end

      def failure_subclass
        klass_factory(Failure, :error, error_klass)
      end

      def klass_factory(klass, symbol, sklass)
        iklass = T.unsafe(Class.new(klass)) # rubocop:disable Sorbet/ForbidTUnsafe
        iklass.const symbol, sklass, override: true
        iklass.__send__(:private, symbol)
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
muina-0.2.8 lib/muina/result/factory.rb
muina-0.2.7 lib/muina/result/factory.rb