// https://github.com/lyonsyonii/run

cmd default() {
   echo "$doc"
}

cmd profile() {
   cargo build --profile profiling
   perf record -F99 --call-graph dwarf ../target/profiling/hunt --hidden $HOME > /dev/null && perf script report gecko
}

sub bench {
   const build = "cp ../target/release/hunt ./hunt-prev; cargo build --release"
   const hunt  = "../target/release/hunt"
   const prev  = "./hunt-prev" // previous hunt version
   const 2_3   = "./hunt-2.3.0"
   const fd    = "fd --unrestricted --color=never"

   cmd all() {
      run bench 1;
      run bench 2;
      run bench 3;
      run bench 4;
      run bench 5;
      run bench 6;
   }
   
   /// Search one file in ~/
   cmd 1() {
      $build;
      CMD="--hidden --first --exact SomeFile $HOME"
      HUNT="$hunt $CMD";
      HUNT_PREV="$prev $CMD";
      HUNT2_3="$2_3 $CMD";
      FD="$fd --max-results=1 SomeFile $HOME";
      FIND="find $HOME -name SomeFile -print -quit";

      hyperfine -N --warmup 1 --ignore-failure \
         "$HUNT" \
         "$HUNT2_3" \
         "$FD" \
         "$FIND";
         # "$HUNT_PREV" \
   }

   /// Search multiple files in ~/
   cmd 2() {
      $build;
      CMD="--hidden SomeFile $HOME";
      HUNT="$hunt $CMD";
      HUNT2_3="$2_3 $CMD";
      HUNT_PREV="$prev $CMD";
      FD="$fd SomeFile $HOME";
      FIND="find $HOME -name SomeFile -print";

      hyperfine -N --warmup 1 --ignore-failure  \
         "$HUNT" \
         "$HUNT2_3" \
         "$FD" \
         "$FIND" \
         # "$HUNT_PREV" \
   }

   /// Search multiple files in /
   cmd 3() {
      $build;
      CMD="--hidden SomeFile /";
      HUNT="$hunt $CMD";
      HUNT2_3="$2_3 $CMD";
      HUNT_PREV="$prev $CMD";
      FD="$fd SomeFile /";

      hyperfine -N --warmup 1 --ignore-failure \
         "$HUNT" \
         "$HUNT2_3" \
         "$FD" \
         # "$HUNT_PREV" \
   }

   /// Search all files in ~/
   cmd 4() {
      $build;
      FD="$fd . $HOME";
      CMD="--hidden -ss $HOME";
      HUNT="$hunt $CMD";
      HUNT2_3="$2_3 $CMD";
      HUNT_PREV="$prev $CMD";

      hyperfine -N --warmup 1 --ignore-failure \
         "$HUNT" \
         "$HUNT2_3" \
         "$FD" \
         # "$HUNT_PREV" \
   }
   
   /// Different task depths
   cmd 5() {
      $build;
      D="HUNT_MAX_DEPTH"
      HUNT="$hunt --hidden --ends .nix flake $HOME"
      
      hyperfine --warmup 1 --ignore-failure \
         "$D=0 $HUNT" \
         "$D=1 $HUNT" \
         "$D=10 $HUNT" \
         "$D=100 $HUNT" \
         "$D=200 $HUNT" \
         "$D=300 $HUNT" \
         "$D=400 $HUNT" \
         "$D=500 $HUNT" \
         "$D=1000 $HUNT" \
         "$D=2000 $HUNT"
   }

   /// Startup time (empty directory)
   cmd 6() {
      $build;
      mkdir empty;
      HUNT="$hunt";
      HUNT2_3="$2_3";
      FD="fd";
      FIND="find $HOME -name SomeFile -print";

      hyperfine -N --ignore-failure \
         "$HUNT empty" \
         "$HUNT2_3 empty" \
         "$FD empty" \
         "$FIND empty";

      rmdir empty;
   }
}