+package solitaire;
+
+import java.util.LinkedList;
+import java.util.List;
+
+final class Foundation {
+ private final List<Card> cards;
+ private final Suit suit;
+
+ Foundation(Suit suit) {
+ this.cards = new LinkedList<>();
+ this.suit = suit;
+ }
+
+ Suit getSuit() {
+ return suit;
+ }
+
+ boolean isFull() {
+ return cards.size() == Rank.RANKS.size();
+ }
+
+ private boolean isValidNextCard(Card card) {
+ Rank cardRank, lastRank;
+
+ if (card.getSuit() != this.suit)
+ return false;
+
+ cardRank = card.getRank();
+
+ if (cards.isEmpty())
+ return cardRank == Rank.ACE;
+
+ lastRank = cards.getLast().getRank();
+
+ return cardRank.isSuccessorOf(lastRank);
+ }
+
+ boolean add(Card card) {
+ if (!isValidNextCard(card))
+ return false;
+
+ cards.add(card);
+ return true;
+ }
+
+ @Override
+ public String toString() {
+ if (cards.isEmpty())
+ return String.format("( %s )", suit);
+
+ return String.format("(%s)", cards.getLast());
+ }
+}