lib/dry/monads/task.rb in dry-monads-1.0.0.beta1 vs lib/dry/monads/task.rb in dry-monads-1.0.0.beta2

- old
+ new

@@ -1,8 +1,10 @@ require 'concurrent/promise' +require 'dry/monads/unit' require 'dry/monads/curry' +require 'dry/monads/conversion_stubs' module Dry module Monads # The Task monad represents an async computation. The implementation # is a rather thin wrapper of Concurrent::Promise from the concurrent-ruby. @@ -66,10 +68,12 @@ v = Undefined.default(value, block) new(Promise.fulfill(v)) end end + include ConversionStubs[:to_maybe, :to_result] + # @api private attr_reader :promise protected :promise # @api private @@ -110,32 +114,10 @@ def bind(&block) self.class.new(promise.flat_map { |value| block.(value).promise }) end alias_method :then, :bind - # Converts to Result. Blocks the current thread if required. - # - # @return [Result] - def to_result - if promise.wait.fulfilled? - Result::Success.new(promise.value) - else - Result::Failure.new(promise.reason, RightBiased::Left.trace_caller) - end - end - - # Converts to Maybe. Blocks the current thread if required. - # - # @return [Maybe] - def to_maybe - if promise.wait.fulfilled? - Maybe::Some.new(promise.value) - else - Maybe::None.new(RightBiased::Left.trace_caller) - end - end - # @return [String] def to_s state = case promise.state when :fulfilled "value=#{ value!.inspect }" @@ -242,10 +224,17 @@ def apply(val = Undefined) arg = Undefined.default(val) { yield } bind { |f| arg.fmap { |v| curry(f).(v) } } end + # Maps a successful result to Unit, effectively discards it + # + # @return [Task] + def discard + fmap { Unit } + end + private # @api private def curry(value) if defined?(@curried) @@ -269,12 +258,16 @@ # Task constructors. # # @api public module Mixin - Task = Task # @private + # @private + Task = Task + # @see Dry::Monads::Unit + Unit = Unit # @private + # Created a mixin with the given executor injected. # # @param executor [Concurrent::AbstractExecutorService,Symbol] # @return [Module] def self.[](executor) @@ -303,7 +296,9 @@ end include Constructors end end + + extend Task::Mixin::Constructors end end