Skip to content

Instantly share code, notes, and snippets.

@kkismd
Created December 19, 2017 02:30
Show Gist options
  • Save kkismd/1ecfbcc94a7d7d49519daef4560dcb9c to your computer and use it in GitHub Desktop.
Save kkismd/1ecfbcc94a7d7d49519daef4560dcb9c to your computer and use it in GitHub Desktop.
Optional class in Ruby
class Optional
private_class_method :new
class << self
def some(value)
new(value, false)
end
def none
new(nil, true)
end
end
def initialize(value, is_none)
@value = value
@is_none = is_none
end
def some?
!none?
end
def none?
@is_none
end
def get
some? ? @value : raise(NoneHasNoValue)
end
def get_or_else(default_value)
some? ? @value : default_value
end
def map(&_block)
return self unless block_given?
if some?
self.class.some(yield @value)
else
self
end
end
class NoneHasNoValue < StandardError; end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment