summary refs log tree commit diff stats
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
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
-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"
kartik/mu/blame/cpp/022call_reply?h=main&id=ec92602746894c81990a37d7a5e5d7f14a518f0e'>^
5109e78f ^

166e3c0d ^
5109e78f ^
1bc0bb7e ^
166e3c0d ^
69f04c3f ^
5109e78f ^
2e8c5d39 ^
77cdc6d0 ^
dd2e01e4 ^
77cdc6d0 ^
c8fbf7b8 ^
647cce32 ^
c8fbf7b8 ^

77cdc6d0 ^
31401373 ^
9d670bb5 ^

9e0eac54 ^
1bc0bb7e ^
8b9f1750 ^
0487a30e ^
32cd40ec ^
1066660e ^
69f04c3f ^
8dacba82 ^
1bc0bb7e ^






996a8acd ^
b24eb476 ^
1bc0bb7e ^




b24eb476 ^
1bc0bb7e ^
5109e78f ^
1bc0bb7e ^

9dcbec39 ^
1bc0bb7e ^

b24eb476 ^
3473c63a ^

5109e78f ^
a3f420b6 ^
9dcbec39 ^
40278ae5 ^
1bc0bb7e ^




b24eb476 ^
1bc0bb7e ^

af023b32 ^
9dcbec39 ^
1bc0bb7e ^

b24eb476 ^
abc70216 ^
acc4792d ^
abc70216 ^

4637d58f ^
9dcbec39 ^
4637d58f ^
1bc0bb7e ^






5109e78f ^
0c0bc3ae ^
1ead3562 ^
192d59d3 ^
0c0bc3ae ^
1ead3562 ^
192d59d3 ^

0c0bc3ae ^
1ead3562 ^
0c0bc3ae ^
192d59d3 ^
d135851e ^
87cc473c ^


8b9f1750 ^
4071055a ^
5109e78f ^
5f98a10c ^
1ead3562 ^
192d59d3 ^

87cc473c ^
1ead3562 ^
192d59d3 ^

87cc473c ^
192d59d3 ^
87cc473c ^
5109e78f ^
1ead3562 ^
192d59d3 ^

7402ce32 ^
1ead3562 ^
192d59d3 ^

7402ce32 ^
5f98a10c ^
7402ce32 ^
8dacba82 ^
fca0ebbe ^
8dacba82 ^

ac0e9db5 ^
4082acd2 ^
8dacba82 ^


b24eb476 ^
8dacba82 ^
4082acd2 ^
8dacba82 ^



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158