It's not any more attractive but it removes the overhead of copying memory at
runtime:
proc `[]=`*[T](arr: var openArray[T], slice: Slice[int], val: T) =
for x in slice:
arr[x] = val
proc `[]=`*[T](arr: var openArray[T], slice: HSlice[int, BackwardsIndex],
val: T) =
for x in slice.a.. arr.len - int(slice.b):
arr[x] = val
proc `[]=`*[T](arr: var openArray[T], slice: HSlice[int, BackwardsIndex],
val: openArray[T]) =
for x in slice.a.. arr.len - int(slice.b):
arr[x] = val[x - slice.a]
proc `[]=`*[T](arr: var openArray[T], slice: Slice[BackwardsIndex], val:
openArray[T]) =
for x in arr.len - int(slice.a) .. arr.len - int(slice.b):
arr[x] = val[x - arr.len - int(slice.a)]
proc `[]=`*[T](arr: var openArray[T], slice: Slice[int], val: openArray[T])
=
for x in slice.a..slice.b:
arr[x] = val[x - slice.a]
var sz = static:
var val: array[64, byte]
val[0..3] = [1u8, 2, 3, 4]
val
echo sz
var ssz = static: # Do this at CT instead of runtime
var val: array[64, byte]
val[0..3] = [1u8, 2, 3, 4]
val[4..^1] = 0xf
val
echo ssz
Run