exp_tuple.pony

use json = "../json"

class val ExpTuple is NodeData
  """A tuple expression."""

  let sequences: NodeSeqWith[Expression]

  new val create(sequences': NodeSeqWith[Expression]) =>
    sequences = sequences'

  fun name(): String => "ExpTuple"

  fun val clone(updates: ChildUpdateMap): NodeData =>
    ExpTuple(_map[Expression](sequences, updates))

  fun add_json_props(node: Node box, props: Array[(String, json.Item)]) =>
    if sequences.size() > 0 then
      props.push(("sequences", node.child_refs(sequences)))
    end

primitive ParseExpTuple
  fun apply(obj: json.Object val, children: NodeSeq): (ExpTuple | String) =>
    let sequences =
      match ParseNode._get_seq_with[Expression](
        obj,
        children,
        "sequences",
        "ExpTuple.sequences must be a sequence of Expressions")
      | let seq: NodeSeqWith[Expression] =>
        seq
      | let err: String =>
        return err
      end
    ExpTuple(sequences)