1
1
2
-
3
2
function nprev_type (x:: T , n) where {T}
4
3
return [x = prev_type (x) for _ in 1 : n]:: Vector{T}
5
4
end
@@ -101,7 +100,13 @@ UnitMRange(1:12)
101
100
i = last (x)
102
101
return vcat (x, nnext_type (i, n))
103
102
end
104
- grow_last (x:: AbstractRange , n:: Integer ) = set_last (x, last (x) + step (x) * n)
103
+ function grow_last (x:: AbstractRange , n:: Integer )
104
+ if parent_type (x) <: typeof (x)
105
+ return set_last (x, last (x) + step (x) * n)
106
+ else
107
+ return unsafe_reconstruct (x, grow_last (parent (x), n))
108
+ end
109
+ end
105
110
grow_last (x:: AbstractRange , n:: AbstractUnitRange ) = unsafe_reconstruct (x, n)
106
111
107
112
"""
@@ -126,7 +131,14 @@ function grow_last!(x::AbstractVector, n::Integer)
126
131
i = last (x)
127
132
return append! (x, nnext_type (i, n))
128
133
end
129
- grow_last! (x:: AbstractRange , n:: Integer ) = set_last! (x, last (x) + step (x) * n)
134
+ function grow_last! (x:: AbstractRange , n:: Integer )
135
+ if parent_type (x) <: typeof (x)
136
+ set_last! (x, last (x) + step (x) * n)
137
+ else
138
+ grow_last! (parent (x), n)
139
+ end
140
+ return x
141
+ end
130
142
131
143
"""
132
144
grow_first(x, n)
@@ -148,7 +160,13 @@ function grow_first(x::AbstractVector, n::Integer)
148
160
i = first (x)
149
161
return vcat (reverse! (nprev_type (i, n)), x)
150
162
end
151
- grow_first (x:: AbstractRange , n:: Integer ) = set_first (x, first (x) - step (x) * n)
163
+ function grow_first (x:: AbstractRange , n:: Integer )
164
+ if parent_type (x) <: typeof (x)
165
+ return set_first (x, first (x) - step (x) * n)
166
+ else
167
+ return unsafe_reconstruct (x, grow_first (parent (x), n))
168
+ end
169
+ end
152
170
grow_first (x:: AbstractRange , n:: AbstractUnitRange ) = unsafe_reconstruct (x, n)
153
171
154
172
"""
@@ -173,7 +191,14 @@ function grow_first!(x::AbstractVector, n::Integer)
173
191
i = first (x)
174
192
return prepend! (x, reverse! (nprev_type (i, n)))
175
193
end
176
- grow_first! (x:: AbstractRange , n:: Integer ) = set_first! (x, first (x) - step (x) * n)
194
+ function grow_first! (x:: AbstractRange , n:: Integer )
195
+ if parent_type (x) <: typeof (x)
196
+ set_first! (x, first (x) - step (x) * n)
197
+ else
198
+ grow_first! (parent (x), n)
199
+ end
200
+ return x
201
+ end
177
202
178
203
"""
179
204
shrink_last!(x, n)
@@ -199,7 +224,15 @@ function shrink_last!(x::AbstractVector, n::Integer)
199
224
end
200
225
return x
201
226
end
202
- shrink_last! (x:: AbstractRange , n:: Integer ) = set_last! (x, last (x) - step (x) * n)
227
+ function shrink_last! (x:: AbstractRange , n:: Integer )
228
+ if parent_type (x) <: typeof (x)
229
+ set_last! (x, last (x) - step (x) * n)
230
+ else
231
+ shrink_last! (parent (x), n)
232
+ end
233
+ return x
234
+ end
235
+
203
236
204
237
"""
205
238
shrink_last(x, n)
@@ -218,7 +251,13 @@ UnitMRange(1:8)
218
251
```
219
252
"""
220
253
@propagate_inbounds shrink_last (x:: AbstractVector , n:: Integer ) = x[firstindex (x): end - n]
221
- shrink_last (x:: AbstractRange , n:: Integer ) = set_last (x, last (x) - step (x) * n)
254
+ function shrink_last (x:: AbstractRange , n:: Integer )
255
+ if parent_type (x) <: typeof (x)
256
+ return set_last (x, last (x) - step (x) * n)
257
+ else
258
+ return unsafe_reconstruct (x, shrink_last (parent (x), n))
259
+ end
260
+ end
222
261
shrink_last (x:: AbstractRange , n:: AbstractUnitRange ) = unsafe_reconstruct (x, n)
223
262
224
263
"""
@@ -238,11 +277,17 @@ UnitMRange(3:10)
238
277
```
239
278
"""
240
279
@propagate_inbounds shrink_first (x:: AbstractVector , n:: Integer ) = x[(firstindex (x) + n): end ]
241
- shrink_first (x:: AbstractRange , n:: Integer ) = set_first (x, first (x) + step (x) * n)
242
280
shrink_first (x:: OneTo{T} , n:: Integer ) where {T} = UnitRange {T} (1 + n, last (x))
243
281
shrink_first (x:: OneToMRange{T} , n:: Integer ) where {T} = UnitMRange {T} (1 + n, last (x))
244
282
shrink_first (x:: OneToSRange{T} , n:: Integer ) where {T} = UnitSRange {T} (1 + n, last (x))
245
283
shrink_first (x:: AbstractRange , n:: AbstractUnitRange ) = unsafe_reconstruct (x, n)
284
+ function shrink_first (x:: AbstractRange , n:: Integer )
285
+ if parent_type (x) <: typeof (x)
286
+ return set_first (x, first (x) + (step (x) * n))
287
+ else
288
+ return unsafe_reconstruct (x, shrink_first (parent (x), n))
289
+ end
290
+ end
246
291
247
292
"""
248
293
shrink_first!(x, n)
@@ -255,7 +300,14 @@ function shrink_first!(x::AbstractVector, n::Integer)
255
300
end
256
301
return x
257
302
end
258
- shrink_first! (x:: AbstractRange , n:: Integer ) = set_first! (x, first (x) + step (x) * n)
303
+ function shrink_first! (x:: AbstractRange , n:: Integer )
304
+ if parent_type (x) <: typeof (x)
305
+ set_first! (x, first (x) + step (x) * n)
306
+ else
307
+ shrink_first! (parent (x), n)
308
+ end
309
+ return x
310
+ end
259
311
260
312
"""
261
313
resize_last(x, n::Integer)
0 commit comments