diff --git a/coloring/gradient_benchmark_no_check.nu b/coloring/gradient_benchmark_no_check.nu new file mode 100644 index 0000000..208a0c9 --- /dev/null +++ b/coloring/gradient_benchmark_no_check.nu @@ -0,0 +1,153 @@ +# Kubouch wrote this on/around 01/26/2022 + +def iter_inc [incr mult iter] { + $incr + $mult * $iter +} + +#let is_release = input "Did you compile in a release mode? y/n " +let is_release = "y" + +if ($is_release | str downcase | str trim) == "y" { + + $"running test 0 at (date now | date format '%Y-%m-%d %H:%M:%S.%3f')" + # 0. this has wrong output + let 0 = (seq 10 | benchmark { + let height = 40 + let width = 160 + let stamp = 'Nu' + seq 0 $height | each { |row| + let row_data = (seq 0 $width | each { |col| + let fgcolor = (iter_inc 2 2 $col) + if $fgcolor > 200 && $fgcolor < 210 { + $"(ansi -e '48;2;0;0;')($fgcolor)m($stamp)(ansi -e '0m')" + } else { + $"(ansi -e '48;2;0;0;')($fgcolor)m(char sp)(ansi -e '0m')" + } + } | str collect) + $"($row_data)(char newline)" + } | str collect + } | math avg) + + + $"running test 1 at (date now | date format '%Y-%m-%d %H:%M:%S.%3f')" + # 1. Fixed newline to fix the output (char cr) + let 1 = (seq 10 | benchmark { + let height = 40 + let width = 160 + let stamp = 'Nu' + seq 0 $height | each { |row| + let row_data = (seq 0 $width | each { |col| + let fgcolor = (iter_inc 2 2 $col) + if $fgcolor > 200 && $fgcolor < 210 { + $"(ansi -e '48;2;0;0;')($fgcolor)m($stamp)(ansi -e '0m')" + } else { + $"(ansi -e '48;2;0;0;')($fgcolor)m(char sp)(ansi -e '0m')" + } + } | str collect) + $"($row_data)(char cr)" + } | str collect + } | math avg) + + $"running test 2 at (date now | date format '%Y-%m-%d %H:%M:%S.%3f')" + # 2. Replace (char sp) with just space + let 2 = (seq 10 | benchmark { + let height = 40 + let width = 160 + let stamp = 'Nu' + seq 0 $height | each { |row| + let row_data = (seq 0 $width | each { |col| + let fgcolor = (iter_inc 2 2 $col) + if $fgcolor > 200 && $fgcolor < 210 { + $"(ansi -e '48;2;0;0;')($fgcolor)m($stamp)(ansi -e '0m')" + } else { + $"(ansi -e '48;2;0;0;')($fgcolor)m (ansi -e '0m')" + } + } | str collect) + $"($row_data)(char cr)" + } | str collect + } | math avg) + + $"running test 3 at (date now | date format '%Y-%m-%d %H:%M:%S.%3f')" + # 3. Precompute (ansi -e '48;2;0;0;') and (ansi -e '0m') -- seems to be slower + let 3 = (seq 10 | benchmark { + let height = 40 + let width = 160 + let stamp = 'Nu' + let ansi1 = ansi -e '48;2;0;0;' + let ansi2 = ansi -e '0m' + seq 0 $height | each { |row| + let row_data = (seq 0 $width | each { |col| + let fgcolor = (iter_inc 2 2 $col) + if $fgcolor > 200 && $fgcolor < 210 { + $"($ansi1)($fgcolor)m($stamp)($ansi2)" + } else { + $"($ansi1)($fgcolor)m(char sp)($ansi2)" + } + } | str collect) + $"($row_data)(char cr)" + } | str collect + } | math avg) + + $"running test 4 at (date now | date format '%Y-%m-%d %H:%M:%S.%3f')" + # 4. Inline iter_inc call + let 4 = (seq 10 | benchmark { + let height = 40 + let width = 160 + let stamp = 'Nu' + seq 0 $height | each { |row| + let row_data = (seq 0 $width | each { |col| + let fgcolor = 2 + 2 * $col + if $fgcolor > 200 && $fgcolor < 210 { + $"(ansi -e '48;2;0;0;')($fgcolor)m($stamp)(ansi -e '0m')" + } else { + $"(ansi -e '48;2;0;0;')($fgcolor)m(char sp)(ansi -e '0m')" + } + } | str collect) + $"($row_data)(char cr)" + } | str collect + } | math avg) + + $"running test 5 at (date now | date format '%Y-%m-%d %H:%M:%S.%3f')" + # 5. Combine (char sp) substitution and iter_inc inlining + let 5 = (seq 10 | benchmark { + let height = 40 + let width = 160 + let stamp = 'Nu' + seq 0 $height | each { |row| + let row_data = (seq 0 $width | each { |col| + let fgcolor = 2 + 2 * $col + if $fgcolor > 200 && $fgcolor < 210 { + $"(ansi -e '48;2;0;0;')($fgcolor)m($stamp)(ansi -e '0m')" + } else { + $"(ansi -e '48;2;0;0;')($fgcolor)m (ansi -e '0m')" + } + } | str collect) + $"($row_data)(char cr)" + } | str collect + } | math avg) + + $"running test 6 at (date now | date format '%Y-%m-%d %H:%M:%S.%3f')" + # 6. The above with par-each outer loop (using par-each anywhere else breaks the output) + let 6 = (seq 10 | benchmark { + let height = 40 + let width = 160 + let stamp = 'Nu' + seq 0 $height | par-each { |row| + let row_data = (seq 0 $width | each { |col| + let fgcolor = 2 + 2 * $col + if $fgcolor > 200 && $fgcolor < 210 { + $"(ansi -e '48;2;0;0;')($fgcolor)m($stamp)(ansi -e '0m')" + } else { + $"(ansi -e '48;2;0;0;')($fgcolor)m (ansi -e '0m')" + } + } | str collect) + $"($row_data)(char cr)" + } | str collect + } | math avg) + + echo 'collating tests' + [ $0 $1 $2 $3 $4 $5 $6 ] + +} else { + echo "Compile in a release mode!" +} diff --git a/coloring/sg.nu b/coloring/sg.nu new file mode 100644 index 0000000..a600c2c --- /dev/null +++ b/coloring/sg.nu @@ -0,0 +1,102 @@ +# This is just for benchmarking +# it uses the no check benchmark so it doesn't prompt you +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu +source gradient_benchmark_no_check.nu diff --git a/progress_bar/percent_meter.nu b/progress_bar/percent_meter.nu new file mode 100644 index 0000000..10189e1 --- /dev/null +++ b/progress_bar/percent_meter.nu @@ -0,0 +1,21 @@ +def loading [] { + print -n $"Loading (char newline)" + 0..100 | each { |tick| + sleep 50ms + # I believe '1000D' means move the cursor to the left 1000 columns + print -n $"(ansi -e '1000D')($tick)%" + } + #show_cursor +} + +def show_cursor [] { + print $"(ansi -e '?25h')" +} + +def hide_cursor [] { + print $"(ansi -e '?25l')" +} + +hide_cursor +loading +show_cursor \ No newline at end of file diff --git a/progress_bar/progress_bar.nu b/progress_bar/progress_bar.nu new file mode 100644 index 0000000..e21f045 --- /dev/null +++ b/progress_bar/progress_bar.nu @@ -0,0 +1,52 @@ +# progress bar attempt +# https://askubuntu.com/questions/747143/create-a-progress-bar-in-bash +# https://www.shellscript.sh/tips/progressbar/ + +# There is a strange artifact drawing the first two full blocks +# You can see this artifact better in progress_bar_no_back.nu +# I'm not sure what's going on nor how to fix it. + +let pb_len = 25 +let bg_fill = "▒" # Fill up to $pb_len +let blocks = ["▏" "▎" "▍" "▌" "▋" "▊" "▉" "█"] + +# "█" #8/8 +# "▉" #7/8 +# "▊" #3/4 +# "▋" #5/8 +# "▌" #1/2 +# "▍" #3/8 +# "▎" #1/4 +# "▏" #1/8 + +# Turn off the cursor +ansi cursor_off +# Move cursor all the way to the left +print -n $"(ansi -e '1000D')" +# Draw the background for the progress bar +print -n ($bg_fill | str lpad -c $bg_fill -l $pb_len) + +1..<$pb_len | each { |cur_progress| + # This is kind of a hack because it's not incrementally drawing a new box + # It's drawing the entire row every time with a different padding amount + # echo $blocks.7 | str lpad -c $blocks.7 -l $it + + 0..7 | each { |tick| + let cur_idx = ($tick mod 8) + let cur_block = (echo $blocks | get $cur_idx) + print -n $"(ansi -e '1000D')($cur_block | str lpad -c $blocks.7 -l $cur_progress)" + sleep 20ms + } + print -n $"(ansi -e '1000D')" +} +# Fill in the last background block +print $"($blocks.7 | str lpad -c $blocks.7 -l $pb_len)" +"Done" +ansi cursor_on + + +# Try to do this in the next version +# Make it a custom command so you can do +# set-progress 33 100 +# and the display look like +# 33% (33/100) [███████████ ] \ No newline at end of file diff --git a/progress_bar/progress_bar_no_back.nu b/progress_bar/progress_bar_no_back.nu new file mode 100644 index 0000000..1e82781 --- /dev/null +++ b/progress_bar/progress_bar_no_back.nu @@ -0,0 +1,15 @@ +let blocks = ["▏" "▎" "▍" "▌" "▋" "▊" "▉" "█"] +let pb_size = 25 +ansi cursor_off +1..<$pb_size | each { |cur_size| + 0..7 | each { |tick| + let idx = ($tick mod 8) + let cur_block = ($blocks | get $idx) + print -n $"(ansi -e '1000D')($cur_block | str lpad -c $blocks.7 -l $cur_size)" + # sleep 1ms + } +} +char newline +'Done' +ansi cursor_on +