#!/usr/bin/env bash

set -o nounset -o noglob +o braceexpand
shopt -s lastpipe
export LC_ALL='C.UTF-8'

tab_spaces=8

sed_expr='s/[[:blank:]]+$//'

test=$'  \tLine with tabs\t why?\t  '

repeat="${1}"

coproc line_buffered {
  stdbuf --output=L -- \
      sed --binary --regexp-extended --expression="${sed_expr}" |
    stdbuf --output=L -- \
        expand --tabs="${tab_spaces}"
}

printf '%s' "Line-buffered:"
time {
  for (( i = 0; i < repeat; i++ )); do
    printf '%s\n' "${test}" >&"${line_buffered[1]}"
    IFS='' read -r line <&"${line_buffered[0]}"
    printf '|%s|\n' "${line}" > /dev/null
  done
}

exec {line_buffered[0]}<&- {line_buffered[1]}>&-
wait "${line_buffered_PID}"

coproc unbuffered {
  stdbuf --output=0 -- \
      sed --binary --regexp-extended --expression="${sed_expr}" |
    stdbuf --output=0 -- \
        expand --tabs="${tab_spaces}"
}

printf '%s' "Unbuffered:"
time {
  for (( i = 0; i < repeat; i++ )); do
    printf '%s\n' "${test}" >&"${unbuffered[1]}"
    IFS='' read -r line <&"${unbuffered[0]}"
    printf '|%s|\n' "${line}" > /dev/null
  done
}

exec {unbuffered[0]}<&- {unbuffered[1]}>&-
wait "${unbuffered_PID}"
