Skip to content

Instantly share code, notes, and snippets.

@andrewberls
Last active August 29, 2015 13:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andrewberls/9500966 to your computer and use it in GitHub Desktop.
Save andrewberls/9500966 to your computer and use it in GitHub Desktop.
class NoSuchElementException < StandardError; end
class Option
def initialize(val)
@val = val
end
def present?
!@val.nil?
end
def map(&block)
if present?
Option(block.call(@val))
else
Option(nil)
end
end
def flat_map(&block)
if present?
block.call(@val)
else
Option(nil)
end
end
def get_or_else(fallback)
present? ? @val : fallback
end
def to_s
if present?
"#<Option: Some(#{@val})>"
else
"#<Option: None>"
end
end
end
def Option(val)
Option.new(val)
end
Some = -> (val) { val.present? }
None = -> (val) { !val.present? }
opt = Option(2)
case opt
when Some
puts "opt had a present val!"
when None
puts "opt was a blank val"
end
nil_opt = Option(nil)
case nil_opt
when Some
puts "wat"
when None
puts "nil_opt was a blank val"
end
puts Option(2).get_or_else(3) # => 2
puts Option(nil).get_or_else(3) # => 3
puts Option(2).map { |x| x * 2 } # => #<Option: Some(4)>
puts Option(2).flat_map { |x| Option(x * 2) } # => #<Option: Some(4)>
puts Option(nil).map { |x| x * 2 } # => #<Option: None>
puts Option(nil).flat_map { |x| Option(x * 2) } # => #<Option: None>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment