///|
pub fn[A, B, C] Parser::between(
  self : Parser[A],
  open~ : Parser[B],
  close~ : Parser[C],
) -> Parser[A] {
  open
  .discard_spaces()
  .discard_left(self.discard_spaces())
  .discard_right(close)
  .discard_spaces()
}

///|
pub fn[A] Parser::round_bracket(self : Parser[A]) -> Parser[A] {
  self.between(open=char('('), close=char(')'))
}

///|
pub fn[A] Parser::square_bracket(self : Parser[A]) -> Parser[A] {
  self.between(open=char('['), close=char(']'))
}

///|
pub fn[A] Parser::curly_bracket(self : Parser[A]) -> Parser[A] {
  self.between(open=char('{'), close=char('}'))
}