From 8bf4f27f304a55faeef8f94600af38a70111c78f Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Tue, 4 May 2021 16:17:09 +0200 Subject: [PATCH] Avoid wrapping option in option when using .?[] operator --- questionable/options.nim | 9 +++++++++ testmodules/options/test.nim | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/questionable/options.nim b/questionable/options.nim index b576627..748dd84 100644 --- a/questionable/options.nim +++ b/questionable/options.nim @@ -62,6 +62,15 @@ template `|?`*[T](option: ?T, fallback: T): T = else: fallback +macro `.?`*[T](option: ?T, brackets: untyped{nkBracket}): untyped = + let index = brackets[0] + quote do: + type U = typeof(`option`.unsafeGet().?[`index`].unsafeGet()) + if `option`.isSome: + `option`.unsafeGet().?[`index`] + else: + U.none + Option.liftUnary(`-`) Option.liftUnary(`+`) Option.liftUnary(`@`) diff --git a/testmodules/options/test.nim b/testmodules/options/test.nim index 260fff3..c069e3d 100644 --- a/testmodules/options/test.nim +++ b/testmodules/options/test.nim @@ -230,6 +230,11 @@ suite "optionals": check (a & b) == 42.some + test ".?[] avoids wrapping option in option": + let a = @[41, 42].some + + check a.?[1] == 42.some + test "examples from readme work": var x: ?int