class NSWTopo::Map

def move(name, before: nil, after: nil)

def move(name, before: nil, after: nil)
  name, target = [name, before || after].map do |name|
    Layer.sanitise name
  end.each do |name|
    raise OptionParser::InvalidArgument, "no such layer: #{name}" unless @layers.key? name
  end
  raise OptionParser::InvalidArgument, "layers must be different" if name == target
  insert = [name, @layers.delete(name)]
  @layers.each.with_object [] do |(name, layer), layers|
    layers << insert if before && name == target
    layers << [name, layer]
    layers << insert if after && name == target
  end.tap do |layers|
    @layers.replace layers.to_h
  end
  save
end