private void move( Wallet dest, Wallet src, Yen moveAmount) {
            final Yen preAmount = dest.getTotalAmount().add( src.getTotalAmount());

            // FIXME: 投入金額からお金を崩して、moveAmountちょうどの金額ができるようにする
            // 安いコインから順に移動させる
            Deque<Coin> coins = Queues.newArrayDeque( //
                ImmutableSortedMultiset.copyOf( Coins.ascComparator(), src));
            Yen remaining = moveAmount;
            Wallet workWallet = new Wallet();
            while ( remaining.compareTo( Yen.zero()) > 0) {
                // ループ中にcoinsが空になるのはありえない
                if ( coins.isEmpty()) {
                    throw new AssertionError();
                }
                Coin coin = coins.poll();

                // moveAmountより高いお金が来たら、崩してDequeの最初に入れる
                while ( coin.getAmount().compareTo( remaining) > 0) {
                    // 安いコインから使いたい
                    // 降順ソートのコインたちをDequeの先頭要素に挿入していくと、逆順になる
                    ImmutableSortedMultiset<Coin> tmps = ImmutableSortedMultiset.copyOf( //
                        Coins.descComparator(), //
                        Coins.exchange( coin) //
                        );
                    for ( Coin tmp : tmps) {
                        coins.addFirst( tmp);
                    }
                    coin = coins.poll();
                }

                remaining = remaining.subtract( coin.getAmount());
                workWallet.add( coin);
            }
            checkState( workWallet.getTotalAmount().compareTo( moveAmount) == 0, "workWallet=%s, coins=%s, moveAmount=%s, dest=%s, src=%s",
                workWallet, coins, moveAmount, dest, src);

            // 計算が正しく行われたため、一気にお金を移動させる
            src.clear();
            src.addAll( coins);
            dest.addAll( workWallet);

            final Yen postAmount = dest.getTotalAmount().add( src.getTotalAmount());
            checkState( //
                preAmount.compareTo( postAmount) == 0, //
                "投入金額から%sを金庫にしまった結果、%sから%sに投入金額と金庫の金額の合計値が変化しました。", //
                moveAmount, preAmount, postAmount //
            );
        }