Skip to content

Instantly share code, notes, and snippets.

@maiha
Last active December 27, 2016 06:00
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 maiha/d4e8ee206f1a1a26a2a7f8937ff3c199 to your computer and use it in GitHub Desktop.
Save maiha/d4e8ee206f1a1a26a2a7f8937ff3c199 to your computer and use it in GitHub Desktop.
Try.cr
def parse(str)
JSON.parse(str)
end
pp parse("1") # => 1
pp parse("x") # raise JSON::ParseException
begin
v = parse("1")
# use v
rescue
# ...
end
# Not useful
def parse(str)
JSON.parse(str)
rescue
nil
end
pp parse("1") # => 1
pp parse("x") # => nil
# Useful, but what happened?
def parse(str)
Try(JSON::Any).try {
JSON.parse(str)
}
end
pp parse("1") # => #<Success(JSON::Any):0x2257d00 @value=1>
pp parse("x") # => #<Failure(JSON::Any):0x2257960 @value=...
v = parse("1")
case v
when Success
v.get # => JSON::Any
when Failure
v.failed.value # => JSON::ParseException
end
# We can see what happened, but useful?
# Yup, it's useful because we can chain it!
def to_int(v)
Try(Int32).try { v.to_s.to_i }
end
def pretty_size(v)
Try(String).try { "%.1f KB" % [v / 1000.0] }
end
p parse("1").flat_map{|v| to_int(v)}.flat_map{|v| pretty_size(v)} # => #<Success(String):0x18feee0 @value="0.0 KB">
p parse("x").flat_map{|v| to_int(v)}.flat_map{|v| pretty_size(v)} # => #<Failure(String):0x17b1ae0

crystal

parse("1").flat_map{|v| to_int(v)}.flat_map{|v| pretty_size(v)}
parse("x").flat_map{|v| to_int(v)}.flat_map{|v| pretty_size(v)}

scala

parse("1").flatMap(to_int).flatMap(pretty_size)
parse("x").flatMap(to_int).flatMap(pretty_size)

Readable code! Beautiful! Because methods are first class objects.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment