From a884e5bf6486e8606e2381005e6675a046deb0b5 Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Mon, 20 Nov 2023 14:40:07 +0100 Subject: [PATCH] Fix for Nim 1.2.x --- questionable/indexing.nim | 41 +++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 23 deletions(-) diff --git a/questionable/indexing.nim b/questionable/indexing.nim index b170430..5b80f2d 100644 --- a/questionable/indexing.nim +++ b/questionable/indexing.nim @@ -1,29 +1,24 @@ import std/macros +import std/options -macro `.?`*(expression: seq | string, brackets: untyped{nkBracket}): untyped = - # chain is of shape: (seq or string).?[index] - let index = brackets[0] - quote do: - block: - type T = typeof(`expression`[`index`]) - let evaluated = `expression` - if `index` >= evaluated.low and `index` <= evaluated.high: - evaluated[`index`].some - else: - T.none +proc safeGet[T](expression: seq[T] | openArray[T], index: int): Option[T] = + if index >= expression.low and index <= expression.high: + expression[index].some + else: + T.none -macro `.?`*(expression: openArray, brackets: untyped{nkBracket}): untyped = - # chain is of shape: openArray.?[index] - let index = brackets[0] - quote do: - block: - type T = typeof(`expression`[`index`]) - proc safeGet(arr: openArray[T], i: int): ?T {.gensym.} = - if i >= arr.low and i <= arr.high: - arr[i].some - else: - T.none - safeGet(`expression`, `index`) +proc safeGet(expression: string, index: int): Option[char] = + if index >= expression.low and index <= expression.high: + expression[index].some + else: + char.none + +macro `.?`*(expression: seq | string | openArray, brackets: untyped{nkBracket}): untyped = + # chain is of shape: (seq or string or openArray).?[index] + let index = brackets[0] + quote do: + block: + safeGet(`expression`, `index`) macro `.?`*(expression: typed, brackets: untyped{nkBracket}): untyped = # chain is of shape: expression.?[index]