///|
pub fn[Q : @circuit.Qid] i(
  target : Q,
) -> @circuit.Operation[Q] raise @circuit.QuantumError {
  @circuit.Operation::new(@gates.i(), [target])
}

///|
pub fn[Q : @circuit.Qid] x(
  target : Q,
) -> @circuit.Operation[Q] raise @circuit.QuantumError {
  @circuit.Operation::new(@gates.x(), [target])
}

///|
pub fn[Q : @circuit.Qid] y(
  target : Q,
) -> @circuit.Operation[Q] raise @circuit.QuantumError {
  @circuit.Operation::new(@gates.y(), [target])
}

///|
pub fn[Q : @circuit.Qid] z(
  target : Q,
) -> @circuit.Operation[Q] raise @circuit.QuantumError {
  @circuit.Operation::new(@gates.z(), [target])
}

///|
pub fn[Q : @circuit.Qid] h(
  target : Q,
) -> @circuit.Operation[Q] raise @circuit.QuantumError {
  @circuit.Operation::new(@gates.h(), [target])
}

///|
pub fn[Q : @circuit.Qid] s(
  target : Q,
) -> @circuit.Operation[Q] raise @circuit.QuantumError {
  @circuit.Operation::new(@gates.s(), [target])
}

///|
pub fn[Q : @circuit.Qid] t(
  target : Q,
) -> @circuit.Operation[Q] raise @circuit.QuantumError {
  @circuit.Operation::new(@gates.t(), [target])
}

///|
pub fn[Q : @circuit.Qid] rx(
  angle : Double,
  target : Q,
) -> @circuit.Operation[Q] raise @circuit.QuantumError {
  @circuit.Operation::new(@gates.rx(angle), [target])
}

///|
pub fn[Q : @circuit.Qid] ry(
  angle : Double,
  target : Q,
) -> @circuit.Operation[Q] raise @circuit.QuantumError {
  @circuit.Operation::new(@gates.ry(angle), [target])
}

///|
pub fn[Q : @circuit.Qid] rz(
  angle : Double,
  target : Q,
) -> @circuit.Operation[Q] raise @circuit.QuantumError {
  @circuit.Operation::new(@gates.rz(angle), [target])
}

///|
pub fn[Q : @circuit.Qid] phase(
  angle : Double,
  target : Q,
) -> @circuit.Operation[Q] raise @circuit.QuantumError {
  @circuit.Operation::new(@gates.phase(angle), [target])
}

///|
#alias(cx)
pub fn[Q : @circuit.Qid] cnot(
  control : Q,
  target : Q,
) -> @circuit.Operation[Q] raise @circuit.QuantumError {
  @circuit.Operation::new(@gates.cnot(), [control, target])
}

///|
pub fn[Q : @circuit.Qid] measure(
  targets : Array[Q],
  key~ : String = "m",
) -> @circuit.Operation[Q] raise @circuit.QuantumError {
  @circuit.measure(targets, key~)
}