Skip to content

Commit

Permalink
Allow setdiff to work with actual arrays.
Browse files Browse the repository at this point in the history
  • Loading branch information
cowboy committed Oct 27, 2014
1 parent 4dee59a commit 576ebc3
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 8 deletions.
23 changes: 15 additions & 8 deletions bin/dotfiles
Original file line number Diff line number Diff line change
Expand Up @@ -132,17 +132,24 @@ function _prompt_menu_add() {
# (and not in a good way).
# From http://stackoverflow.com/a/1617303/142339
function setdiff() {
local debug oldifs A B C x
local debug skip a b
if [[ "$1" == 1 ]]; then debug=1; shift; fi
# Convert args to arrays.
A=($1); B=($2); C=()
for x in "${A[@]}"; do
[[ "${B[*]}" =~ (^| )$x($| ) ]] || C=("${C[@]}" "$x")
if [[ "$1" ]]; then
local setdiffA setdiffB setdiffC
setdiffA=($1); setdiffB=($2)
fi
setdiffC=()
for a in "${setdiffA[@]}"; do
skip=
for b in "${setdiffB[@]}"; do
[[ "$a" == "$b" ]] && skip=1 && break
done
[[ "$skip" ]] || setdiffC=("${setdiffC[@]}" "$a")
done
[[ "$debug" ]] && for x in A B C; do
echo "$x ($(eval echo "\${#$x[*]}")) $(eval echo "\${$x[*]}")" 1>&2
[[ "$debug" ]] && for a in setdiffA setdiffB setdiffC; do
echo "$a ($(eval echo "\${#$a[*]}")) $(eval echo "\${$a[*]}")" 1>&2
done
echo "${C[@]}"
[[ "$1" ]] && echo "${setdiffC[@]}"
}

# If this file was being sourced, exit now.
Expand Down
24 changes: 24 additions & 0 deletions test/test_setdiff.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,27 @@ desired=(a a-b); installed=(a-b a); assert "" my_test
desired=(a-b a); installed=(a-b a); assert "" my_test
desired=(a a-b); installed=(a a-b); assert "" my_test
desired=(a-b a); installed=(a a-b); assert "" my_test

unset setdiffA setdiffB setdiffC
setdiff "a b c" "" >/dev/null
assert "0" echo "${#setdiffC[@]}"

unset setdiffA setdiffB setdiffC; setdiffA=(a b c); setdiffB=(); setdiff
assert "3" echo "${#setdiffC[@]}"
assert "a b c" echo "${setdiffC[*]}"

unset setdiffA setdiffB setdiffC; setdiffA=(a b c); setdiffB=(a); setdiff
assert "2" echo "${#setdiffC[@]}"
assert "b c" echo "${setdiffC[*]}"

unset setdiffA setdiffB setdiffC; setdiffA=(a b c); setdiffB=(c a); setdiff
assert "1" echo "${#setdiffC[@]}"
assert "b" echo "${setdiffC[*]}"

unset setdiffA setdiffB setdiffC; setdiffA=("a b" c); setdiffB=(a b c); setdiff
assert "1" echo "${#setdiffC[@]}"
assert "a b" echo "${setdiffC[*]}"

unset setdiffA setdiffB setdiffC; setdiffA=(a b "a b" c "c d"); setdiffB=(a c); setdiff
assert "3" echo "${#setdiffC[@]}"
assert "b a b c d" echo "${setdiffC[*]}"

0 comments on commit 576ebc3

Please sign in to comment.