diff --git a/lib/pure/collections/sequtils.nim b/lib/pure/collections/sequtils.nim index 0eb8e67043..ee89ce17be 100644 --- a/lib/pure/collections/sequtils.nim +++ b/lib/pure/collections/sequtils.nim @@ -20,6 +20,8 @@ include "system/inclrtl" +import macros + when not defined(nimhygiene): {.pragma: dirty.} @@ -704,6 +706,28 @@ template newSeqWith*(len: int, init: untyped): untyped = result[i] = init result +macro asArray*(targetType: untyped, values: typed): untyped = + ## applies a type conversion to each of the elements in the specified + ## array literal. Each element is converted to the ``targetType`` type.. + ## + ## Example: + ## + ## .. code-block:: + ## let x = asArray(int, [0.1, 1.2, 2.3, 3.4]) + ## doAssert x is array[4, int] + ## + ## Short notation for: + ## + ## .. code-block:: + ## let x = [(0.1).int, (1.2).int, (2.3).int, (3.4).int] + values.expectKind(nnkBracket) + result = newNimNode(nnkBracket, lineInfoFrom=values) + for i in 0 ..< len(values): + var call = newNimNode(nnkCall, lineInfoFrom=values[i]) + call.add targetType + call.add values[i] + result.add call + when isMainModule: import strutils block: # concat test @@ -992,5 +1016,11 @@ when isMainModule: seq2D[0][1] = true doAssert seq2D == @[@[true, true], @[true, false], @[false, false], @[false, false]] + block: # asArray tests + let x = asArray(int, [1.2, 2.3, 3.4, 4.5]) + doAssert x is array[4, int] + let y = asArray(`$`, [1.2, 2.3, 3.4, 4.5]) + doAssert y is array[4, string] + when not defined(testing): echo "Finished doc tests" diff --git a/lib/pure/future.nim b/lib/pure/future.nim index de074bd52a..1a3ab688d3 100644 --- a/lib/pure/future.nim +++ b/lib/pure/future.nim @@ -198,33 +198,3 @@ macro dump*(x: typed): untyped = let r = quote do: debugEcho `s`, " = ", `x` return r - -macro asArray*(targetType: untyped, values: typed): untyped = - ## applies a type conversion to each of the elements in the specified - ## array literal. Each element is converted to the ``targetType`` type.. - ## - ## Example: - ## - ## .. code-block:: - ## let x = asArray(int, [0.1, 1.2, 2.3, 3.4]) - ## doAssert x is array[4, int] - ## - ## Short notation for: - ## - ## .. code-block:: - ## let x = [(0.1).int, (1.2).int, (2.3).int, (3.4).int] - values.expectKind(nnkBracket) - result = newNimNode(nnkBracket, lineInfoFrom=values) - for i in 0 ..< len(values): - var call = newNimNode(nnkCall, lineInfoFrom=values[i]) - call.add targetType - call.add values[i] - result.add call - echo result.repr() - -when isMainModule: - block: # asArray tests - let x = asArray(int, [1.2, 2.3, 3.4, 4.5]) - doAssert x is array[4, int] - let y = asArray(`$`, [1.2, 2.3, 3.4, 4.5]) - doAssert y is array[4, string]