summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorClay Sweetser <clay.sweetser@gmail.com>2013-10-20 13:06:07 -0400
committerClay Sweetser <clay.sweetser@gmail.com>2013-10-20 13:06:07 -0400
commit314e526f75bb19b069d438af9c7ad99411ee1da9 (patch)
tree7a3f3f4efc59f64ac74c507c047c3ad4754412be /lib
parenteb4f01223988961e34f2ec1201c2d8e7a3c00de7 (diff)
downloadNim-314e526f75bb19b069d438af9c7ad99411ee1da9.tar.gz
Added an insertion function that inserts elements of an openarray.
Added a deletion function that allows elements between two positions in a sequence to be deleted
Diffstat (limited to 'lib')
-rw-r--r--lib/pure/collections/sequtils.nim50
1 files changed, 50 insertions, 0 deletions
diff --git a/lib/pure/collections/sequtils.nim b/lib/pure/collections/sequtils.nim
index 705a97469..7a520e9a3 100644
--- a/lib/pure/collections/sequtils.nim
+++ b/lib/pure/collections/sequtils.nim
@@ -117,6 +117,38 @@ proc filter*[T](seq1: seq[T], pred: proc(item: T): bool {.closure.}): seq[T] =
   ##   assert f2 == @["yellow"]
   accumulateResult(filter(seq1, pred))
 
+proc delete*[T](s: var seq[T], first, last: int) =
+  ## Deletes in `s` the items at position `first` .. `last`. This modifies
+  ## `s` itself, it does not return a copy.
+  var i = first
+  var j = last+1
+  var newLen = len(s)-j+i
+  while i < newLen:
+    s[i].shallowCopy(s[j])
+    inc(i)
+    inc(j)
+  setlen(s, newLen)
+
+proc insert*[T](dest: var seq[T], src: openArray[T], pos: int) =
+  ## Inserts items from `src` into `dest` at position `pos`. This modifies
+  ## `dest` itself, it does not return a copy.
+  
+  var j = len(dest) - 1
+  var i = len(dest) + len(src) - 1
+  dest.setLen(i + 1)
+
+  # Move items after `pos` to the end of the sequence.
+  while j >= pos:
+    dest[i].shallowCopy(dest[j])
+    dec(i)
+    dec(j)
+  # Insert items from `dest` into `dest` at `pos`
+  inc(j)
+  for item in src:
+    dest[j] = item
+    inc(j)
+
+
 template filterIt*(seq1, pred: expr): expr {.immediate.} =
   ## Returns a new sequence with all the items that fulfilled the predicate.
   ##
@@ -312,4 +344,22 @@ when isMainModule:
     assert multiplication == 495, "Multiplication is (5*(9*(11)))"
     assert concatenation == "nimrodiscool"
 
+  block: # delete tests
+    let outcome = @[1,1,1,1,1,1,1,1]
+    var dest = @[1,1,1,2,2,2,2,2,2,1,1,1,1,1]
+    dest.delete(3, 8)
+    assert outcome == dest, """\
+    Deleting range 3-9 from [1,1,1,2,2,2,2,2,2,1,1,1,1,1] 
+    is [1,1,1,1,1,1,1,1]"""
+
+  block: # insert tests
+    var dest = @[1,1,1,1,1,1,1,1]
+    let 
+      src = @[2,2,2,2,2,2]
+      outcome = @[1,1,1,2,2,2,2,2,2,1,1,1,1,1]
+    dest.insert(src, 3)
+    assert dest == outcome, """\
+    Inserting [2,2,2,2,2,2] into [1,1,1,1,1,1,1,1]
+    at 3 is [1,1,1,2,2,2,2,2,2,1,1,1,1,1]"""
+
   echo "Finished doc tests"