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