///|
/// Original deterministic corpus generator for cross-language interoperability testing.
fn generate(seed : Int32) -> String raise @gml.GraphError {
  if seed < 0 || seed > 1000000 {
    raise @gml.InvalidGraph(
      path="generate.seed",
      reason="seed must be between 0 and 1000000",
    )
  }
  let keys = [
    @gml.Key::new("label", @gml.NodeScope, @gml.StringValue, name="label"),
    @gml.Key::new("active", @gml.NodeScope, @gml.Boolean, name="active"),
    @gml.Key::new(
      "count",
      @gml.NodeScope,
      @gml.Int32,
      name="count",
      default_value=@gml.IntegerValue(7),
    ),
    @gml.Key::new("large", @gml.NodeScope, @gml.Int64, name="large"),
    @gml.Key::new("score", @gml.NodeScope, @gml.Float32, name="score"),
    @gml.Key::new(
      "weight",
      @gml.EdgeScope,
      @gml.Float64,
      name="weight",
      default_value=@gml.DoubleValue(1.5),
    ),
  ]
  let direction = if seed % 2 == 0 { @gml.Directed } else { @gml.Undirected }
  let builder = @gml.FlatBuilder::new(keys, direction, graph_id="G\{seed}")
  let nodes = 1 + seed % 9
  for i = 0; i < nodes; i = i + 1 {
    let attributes = [
      ("label", @gml.TextValue("节点 \{i} <&> 😀\n\t")),
      ("active", @gml.BooleanValue((seed + i) % 2 == 0)),
      ("large", @gml.LongValue(9007199254740993L + seed.to_int64())),
      ("score", @gml.FloatValue(Float::from_double(i.to_double() / 4.0))),
    ]
    if i % 2 == 0 {
      attributes.push(("count", @gml.IntegerValue(seed + i)))
    }
    builder.add_node("n\{i}", attributes~)
  }
  for i = 0; i < seed % 13; i = i + 1 {
    let source = if i < 3 { 0 } else { (seed + i * 3) % nodes }
    let target = if i == 0 {
      source
    } else if i < 3 {
      nodes - 1
    } else {
      (seed + i * 7) % nodes
    }
    let attributes = if i % 2 == 0 {
      [("weight", @gml.DoubleValue((seed + i).to_double() / 2.0))]
    } else {
      []
    }
    builder.add_edge("n\{source}", "n\{target}", id="e\{i}", attributes~)
  }
  @gml.serialize(builder.finish())
}