// Shared byte, integer, and collection helpers.

import std.bytes { Bytes }

export function 거듭제곱이(지수: int) -> int {
  let mut 값 = 1
  let mut 색인 = 0
  while 색인 < 지수 { 값 = 값 * 2; 색인 = 색인 + 1 }
  값
}

export function 십육진숫자(글자: string) -> int {
  if 글자 == "0" { return 0 }
  if 글자 == "1" { return 1 }
  if 글자 == "2" { return 2 }
  if 글자 == "3" { return 3 }
  if 글자 == "4" { return 4 }
  if 글자 == "5" { return 5 }
  if 글자 == "6" { return 6 }
  if 글자 == "7" { return 7 }
  if 글자 == "8" { return 8 }
  if 글자 == "9" { return 9 }
  if 글자 == "a" { return 10 }
  if 글자 == "b" { return 11 }
  if 글자 == "c" { return 12 }
  if 글자 == "d" { return 13 }
  if 글자 == "e" { return 14 }
  if 글자 == "f" { 15 } else { 0 }
}

export function 바이트배열로(입력: Bytes) -> Array<int> {
  let 글자들 = 입력.toHex().scalars()
  let mut 결과: Array<int> = []
  let mut 색인 = 0
  while 색인 < 글자들.length {
    결과.push(십육진숫자(글자들[색인]) * 16 + 십육진숫자(글자들[색인 + 1]))
    색인 = 색인 + 2
  }
  결과
}

export function 바이트로(입력: Array<int>) -> Result<Bytes, string> {
  let 숫자들 = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"]
  let mut 조각들: Array<string> = []
  for 값 in 입력 {
    if 값 < 0 || 값 > 255 { return Err("바이트 범위를 벗어났습니다") }
    조각들.push(숫자들[값 / 16])
    조각들.push(숫자들[값 % 16])
  }
  Bytes.fromHex(조각들.join(""))
}

export function 배열같음(왼쪽: Array<int>, 오른쪽: Array<int>) -> bool {
  if 왼쪽.length != 오른쪽.length { return false }
  let mut 색인 = 0
  while 색인 < 왼쪽.length {
    if 왼쪽[색인] != 오른쪽[색인] { return false }
    색인 = 색인 + 1
  }
  true
}

export function 부분배열(입력: Array<int>, 시작: int, 끝: int) -> Array<int> {
  let mut 결과: Array<int> = []
  let mut 색인 = 시작
  while 색인 < 끝 { 결과.push(입력[색인]); 색인 = 색인 + 1 }
  결과
}

export function 바이트추가(대상: Array<int>, 원본: Array<int>) -> Array<int> {
  let mut 결과 = 대상
  for 값 in 원본 { 결과.push(값) }
  결과
}

export function 비트배타합(왼쪽: int, 오른쪽: int, 자리수: int) -> int {
  let mut 왼 = 왼쪽
  let mut 오 = 오른쪽
  let mut 자리 = 1
  let mut 결과 = 0
  let mut 색인 = 0
  while 색인 < 자리수 {
    if (왼 % 2) != (오 % 2) { 결과 = 결과 + 자리 }
    왼 = 왼 / 2
    오 = 오 / 2
    자리 = 자리 * 2
    색인 = 색인 + 1
  }
  결과
}

export function 작은값(왼쪽: int, 오른쪽: int) -> int { if 왼쪽 < 오른쪽 { 왼쪽 } else { 오른쪽 } }
export function 큰값(왼쪽: int, 오른쪽: int) -> int { if 왼쪽 > 오른쪽 { 왼쪽 } else { 오른쪽 } }

export function 문자열배열에있음(값들: Array<string>, 찾기: string) -> bool {
  for 값 in 값들 { if 값 == 찾기 { return true } }
  false
}
