///|
fn keys(count : Int) -> Array[String] {
  let values : Array[String] = []
  for index = 0; index < count; index = index + 1 {
    values.push("tenant-\{index}")
  }
  values
}

///|
fn topology() -> Array[@shard.ShardNode] {
  [
    @shard.ShardNode::new("edge-east-a", zone="east", rack="a"),
    @shard.ShardNode::new("edge-west-a", zone="west", rack="a"),
    @shard.ShardNode::new("edge-south-a", zone="south", rack="a"),
    @shard.ShardNode::new("edge-north-a", zone="north", rack="a"),
  ]
}

///|
fn main {
  let plan = @shard.plan_capacity_placement(
    keys(24),
    topology(),
    [
      @shard.NodeCapacity::new("edge-east-a", 8, 12),
      @shard.NodeCapacity::new("edge-west-a", 8, 12),
      @shard.NodeCapacity::new("edge-south-a", 8, 12),
      @shard.NodeCapacity::new("edge-north-a", 8, 12),
    ],
    3,
  )
  println(plan.to_json())
  println("accepted_keys=\{plan.accepted_keys()}")
  println("rejected_keys=\{plan.rejected_keys.length()}")
  println("within_capacity=\{plan.is_within_capacity()}")
}