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

Reply via email to