summary refs log tree commit diff stats
path: root/lib/pure/math.nim
diff options
context:
space:
mode:
Diffstat (limited to 'lib/pure/math.nim')
-rw-r--r--lib/pure/math.nim18
1 files changed, 18 insertions, 0 deletions
diff --git a/lib/pure/math.nim b/lib/pure/math.nim
index ee32772b1..72abae265 100644
--- a/lib/pure/math.nim
+++ b/lib/pure/math.nim
@@ -163,6 +163,24 @@ proc prod*[T](x: openArray[T]): T {.noSideEffect.} =
   result = 1.T
   for i in items(x): result = result * i
 
+proc cumsummed*[T](x: openArray[T]): seq[T] =
+  ## Return cumulative aka prefix summation of ``x``.
+  ##
+  ## .. code-block:: nim
+  ##   var x = [1, 2, 3, 4]
+  ##   echo x.cumsummed    # [1, 3, 6, 10]
+  result.setLen(x.len)
+  result[0] = x[0]
+  for i in 1 ..< x.len: result[i] = result[i-1] + x[i]
+
+proc cumsum*[T](x: var openArray[T]) =
+  ## Transforms ``x`` in-place into its cumulative aka prefix summation.
+  ##
+  ## .. code-block:: nim
+  ##   var x = [1, 2, 3, 4]
+  ##   x.cumsum;  echo x    # [1, 3, 6, 10]
+  for i in 1 ..< x.len: x[i] = x[i-1] + x[i]
+
 {.push noSideEffect.}
 when not defined(JS): # C
   proc sqrt*(x: float32): float32 {.importc: "sqrtf", header: "<math.h>".}