fun compare (x, y) {
  x - y
}

fun bubbleSort (l) {
  fun inner (l) {
    case l of
      x : z@(y : tl) ->
       if compare (x, y) > 0
       then [true, y : inner (x : tl) [1]]
       else case inner (z) of [f, z] -> [f, x : z] esac
       fi
    | _ -> [false, l]
    esac
  }

  fun rec (l) {
    case inner (l) of
      [true , l] -> rec (l)
    | [false, l] -> l
    esac
  }

  rec (l)
}

fun generate (n) {
  if n then n : generate (n-1) else {} fi
}

bubbleSort (generate (1000))