aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2021-01-26 13:15:50 -0300
committerEuAndreh <eu@euandre.org>2021-01-26 13:15:50 -0300
commit000b74b1140f2ac41cb5d00a9070db735abdc9c4 (patch)
tree03f8093c5028a3c72880987a211c7f8a4970eb25
parentMove other Guix files under build-aux/guix/ (diff)
downloadremembering-000b74b1140f2ac41cb5d00a9070db735abdc9c4.tar.gz
remembering-000b74b1140f2ac41cb5d00a9070db735abdc9c4.tar.xz
remembering: Refactor with awk + sort; make it faster
Diffstat (limited to '')
-rwxr-xr-xremembering126
-rwxr-xr-xtests/ranking.sh17
2 files changed, 57 insertions, 86 deletions
diff --git a/remembering b/remembering
index 2f39385..0734dae 100755
--- a/remembering
+++ b/remembering
@@ -68,96 +68,52 @@ if [ ! -e "$PROFILE" ]; then
touch "$PROFILE"
fi
+MERGED="$(mktemp)"
+FILTERED="$(mktemp)"
SORTED_STDIN="$(mktemp)"
-cat | sort > "$SORTED_STDIN"
-
-MERGED=''
-MERGEDF="$(mktemp)"
-FILTERED=''
-FILTEREDF="$(mktemp)"
-
-append() {
- FILTERED="$FILTERED${FILTERED:+
-}$1"
-}
-
-accumulate() {
- MERGED="$MERGED${MERGED:+
-}$1"
-}
-
-end() {
- echo "$FILTERED" > "$FILTEREDF"
- echo "$MERGED" > "$MERGEDF"
- exit
-}
-
-get_left() {
- LEFT="$(echo "$LEFT_L" | head -n1)"
- LEFT_L="$(echo "$LEFT_L" | tail -n+2)"
- if [ -z "$LEFT" ]; then
- accumulate "$RIGHT_RANKED"
- accumulate "$RIGHT_RANKED_L"
- end
- fi
-}
-
-get_right() {
- RIGHT_RANKED="$(echo "$RIGHT_RANKED_L" | head -n1)"
- RIGHT_RANKED_L="$(echo "$RIGHT_RANKED_L" | tail -n+2)"
- if [ -z "$RIGHT_RANKED" ]; then
- STDIN_LEFTOVER="$(echo "$LEFT_L" | awk '/./{print "0:" $0}')"
- append "$STDIN_LEFTOVER"
- accumulate "$STDIN_LEFTOVER"
- end
- fi
-}
-
-(
- LEFT_L="$(cat "$SORTED_STDIN")"
- RIGHT_RANKED_L="$(cat "$PROFILE")"
- get_right
- get_left
- while true; do
- RIGHT="$(echo "$RIGHT_RANKED" | cut -d: -f2-)"
- if [ "$LEFT" = "$RIGHT" ]; then
- append "$RIGHT_RANKED"
- accumulate "$RIGHT_RANKED"
- get_right
- get_left
- continue
- fi
-
- if [ "$(expr "$LEFT" \< "$RIGHT")" = 1 ]; then
- append "0:$LEFT"
- accumulate "0:$LEFT"
- get_left
- continue
- else
- get_right
- accumulate "$RIGHT_RANKED"
- continue
- fi
- done
-)
-
-CHOICE="$(sort -t: -k1nr,1 -k2,2 < "$FILTEREDF" | \
+cat | sort -u > "$SORTED_STDIN"
+
+xargs printf '0:%s\n' < "$SORTED_STDIN" | \
+ sort -t: -k2,2 -m - "$PROFILE" | \
+ tac | \
+ sort -t: -k2,2 -u > "$MERGED"
+
+xargs printf 'filter_marker:%s\n' < "$SORTED_STDIN" | \
+ cat - "$PROFILE" | \
+ sort -t: -k2,2 | \
+ awk '{
+ split($0, l, ":")
+ rank = l[1]
+ entry = substr($0, length(rank) + 2)
+ if (rank != "filter_marker") {
+ prev_rank = rank
+ prev_entry = entry
+ } else {
+ if (prev_entry == entry) {
+ print prev_rank ":" entry
+ } else {
+ print "0:" entry
+ }
+ }
+ }' > "$FILTERED"
+
+CHOICE="$(sort -t: -k1nr,1 -k2,2 < "$FILTERED" | \
cut -d: -f2- | \
sh -c "$COMMAND")"
-NEW_PROFILE="$(mktemp)"
if [ -n "$CHOICE" ]; then
- while IFS='' read -r LINE_RANKED; do
- LINE="$(echo "$LINE_RANKED" | cut -d: -f2-)"
- if [ "$CHOICE" = "$LINE" ]; then
- RANK="$(echo "$LINE_RANKED" | cut -d: -f1)"
- NEW_RANK=$((RANK + 1))
- echo "$NEW_RANK:$LINE" >> "$NEW_PROFILE"
- else
- echo "$LINE_RANKED" >> "$NEW_PROFILE"
- fi
- done < "$MERGEDF"
+ NEW_PROFILE="$(mktemp)"
+ awk -v choice="$CHOICE" '{
+ split($0, l, ":")
+ rank = l[1]
+ entry = substr($0, length(rank) + 2)
+ if (entry == choice) {
+ # Naively increment ranking by one
+ print rank + 1 ":" entry
+ } else {
+ print rank ":" entry
+ }
+ }' "$MERGED" > "$NEW_PROFILE"
mv "$NEW_PROFILE" "$PROFILE"
echo "$CHOICE"
fi
-
diff --git a/tests/ranking.sh b/tests/ranking.sh
index 370c61b..ea9c2c6 100755
--- a/tests/ranking.sh
+++ b/tests/ranking.sh
@@ -230,10 +230,24 @@ test_stdin_is_empty() {
test_ok
}
+
+test_profile_does_not_exist() {
+ testing 'profile does not exist'
+ PROFILE="profile-does-not-exist-$(uuid)"
+ INPUT='a
+b
+c
+d
+e'
+ pick_x a "$INPUT"
+ assert_profile "$PROFILE" "$BASE_PROFILE_A_PICKED"
+ test_ok
+}
+
test_profile_is_empty() {
testing 'profile is empty'
PROFILE="profile-is-empty-$(uuid)"
- echo '' > "$XDG_DATA_HOME/$PROFILE"
+ printf '' > "$XDG_DATA_HOME/$PROFILE"
INPUT='a
b
c
@@ -253,4 +267,5 @@ test_stdin_profile_merging
test_stdin_is_larger_than_profile
test_stdin_is_smaller_than_profile
test_stdin_is_empty
+test_profile_does_not_exist
test_profile_is_empty