Module: Fear::Try
Overview
only non-fatal exceptions are caught by the combinators on Try. Serious system errors, on the other hand, will be thrown.
all Try combinators will catch exceptions and return failure unless otherwise specified in the documentation.
The Try represents a computation that may either result in an exception, or return a successfully computed value. Instances of Try, are either an instance of Success or Failure.
For example, Try can be used to perform division on a user-defined input, without the need to do explicit exception-handling in all of the places that an exception might occur.
An important property of Try shown in the above example is its ability to pipeline, or chain, operations, catching exceptions along the way. The flat_map and map combinators in the above example each essentially pass off either their successfully completed value, wrapped in the Success type for it to be further operated upon by the next combinator in the chain, or the exception wrapped in the Failure type usually to be simply passed on down the chain. Combinators such as recover_with and recover are designed to provide some type of default behavior in the case of failure.
Defined Under Namespace
Modules: Mixin
Class Method Summary collapse
-
.matcher {|| ... } ⇒ Fear::PartialFunction
Build pattern matcher to be used later, despite off Try#match method, id doesn’t apply matcher immanently, but build it instead.
Instance Method Summary collapse
-
#any? {|value| ... } ⇒ Boolean
Returns
falseifFailureor returns the result of the application of the given predicate to theSuccessvalue. -
#each {|value| ... } ⇒ Try
Performs the given block if this is a
Success. -
#failure? ⇒ Boolean
Returns
trueif it is aFailure,falseotherwise. -
#flat_map {|value| ... } ⇒ Try
Returns the given block applied to the value from this
Successor returns this if this is aFailure. -
#flatten ⇒ Try
Transforms a nested
Try, ie, aSuccessofSuccess, into an un-nestedTry, ie, aSuccess. -
#get ⇒ any
Returns the value from this
Successor raise the exception if this is aFailure. -
#get_or_else(*args) ⇒ Object
Returns the value from this
Successor evaluates the given default argument if this is aFailure. -
#include?(other_value) ⇒ Boolean
Returns
trueif it has an element that is equal (as determined by ==) toother_value,falseotherwise. -
#map {|value| ... } ⇒ Object
Maps the given block to the value from this
Successor returns this if this is aFailure. -
#match(&matcher) ⇒ Object
Pattern match against this
Try. -
#or_else(&alternative) ⇒ Try
Returns this
Tryif it’s aSuccessor the given alternative if this is aFailure. -
#recover {|matcher| ... } ⇒ Fear::Try
Applies the given block to exception.
-
#recover_with {|matcher| ... } ⇒ Fear::Try
Applies the given block to exception.
-
#select {|value| ... } ⇒ Try
Converts this to a
Failureif the predicate is not satisfied. -
#success? ⇒ Boolean
Returns
trueif it is aSuccess,falseotherwise. -
#to_either ⇒ Right<any>, Left<StandardError>
Returns
Leftwith exception if this is aFailure, otherwise returnsRightwithSuccessvalue. -
#to_option ⇒ Option
Returns an
Somecontaining theSuccessvalue or aNoneif this is aFailure.
Class Method Details
.matcher {|| ... } ⇒ Fear::PartialFunction
Build pattern matcher to be used later, despite off Try#match method, id doesn’t apply matcher immanently, but build it instead. Unusually in sake of efficiency it’s better to statically build matcher and reuse it later.
281 282 283 |
# File 'lib/fear/try.rb', line 281 def matcher(&matcher) TryPatternMatch.new(&matcher) end |
Instance Method Details
#any? {|value| ... } ⇒ Boolean
Returns false if Failure or returns the result of the application of the given predicate to the Success value.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#each {|value| ... } ⇒ Try
if block raise an error, then this method may raise an exception.
Performs the given block if this is a Success.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#failure? ⇒ Boolean
Returns true if it is a Failure, false otherwise.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#flat_map {|value| ... } ⇒ Try
Returns the given block applied to the value from this Success or returns this if this is a Failure.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#flatten ⇒ Try
Transforms a nested Try, ie, a Success of Success, into an un-nested Try, ie, a Success.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#get ⇒ any
Returns the value from this Success or raise the exception if this is a Failure.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#get_or_else(&default) ⇒ any #get_or_else(default) ⇒ any
Returns the value from this Success or evaluates the given default argument if this is a Failure.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#include?(other_value) ⇒ Boolean
Returns true if it has an element that is equal (as determined by ==) to other_value, false otherwise.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#map {|value| ... } ⇒ Object
Maps the given block to the value from this Success or returns this if this is a Failure.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#match(&matcher) ⇒ Object
Pattern match against this Try
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#or_else(&alternative) ⇒ Try
Returns this Try if it’s a Success or the given alternative if this is a Failure.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#recover {|matcher| ... } ⇒ Fear::Try
Applies the given block to exception. This is like map for the exception.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#recover_with {|matcher| ... } ⇒ Fear::Try
Applies the given block to exception. This is like flat_map for the exception.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#select {|value| ... } ⇒ Try
Converts this to a Failure if the predicate is not satisfied.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#success? ⇒ Boolean
Returns true if it is a Success, false otherwise.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#to_either ⇒ Right<any>, Left<StandardError>
Returns Left with exception if this is a Failure, otherwise returns Right with Success value.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |
#to_option ⇒ Option
Returns an Some containing the Success value or a None if this is a Failure.
252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 |
# File 'lib/fear/try.rb', line 252 module Try # @private def left_class Failure end # @private def right_class Success end class << self # Build pattern matcher to be used later, despite off # +Try#match+ method, id doesn't apply matcher immanently, # but build it instead. Unusually in sake of efficiency it's better # to statically build matcher and reuse it later. # # @example # matcher = # Try.matcher do |m| # m.success(Integer, ->(x) { x > 2 }) { |x| x * 2 } # m.success(String) { |x| x.to_i * 2 } # m.failure(ActiveRecord::RecordNotFound) { :err } # m.else { 'error '} # end # matcher.call(try) # # @yieldparam [Fear::TryPatternMatch] # @return [Fear::PartialFunction] def matcher(&matcher) TryPatternMatch.new(&matcher) end end # Include this mixin to access convenient factory methods. # @example # include Fear::Try::Mixin # # Fear.try { 4/2 } #=> #<Fear::Success value=2> # Fear.try { 4/0 } #=> #<Fear::Failure exception=#<ZeroDivisionError: divided by 0>> # Fear.success(2) #=> #<Fear::Success value=2> # module Mixin # Constructs a +Try+ using the block. This # method ensures any non-fatal exception is caught and a # +Failure+ object is returned. # @return [Try] # def Try(&block) Fear.try(&block) end # @param exception [StandardError] # @return [Failure] # def Failure(exception) Fear.failure(exception) end # @param value [any] # @return [Success] # def Success(value) Fear.success(value) end end end |