All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.danielflower.crickam.scorer.Balls Maven / Gradle / Ivy

There is a newer version: 0.11.3
Show newest version
package com.danielflower.crickam.scorer;

import com.danielflower.crickam.scorer.events.BallCompletedEvent;

import java.util.Iterator;
import java.util.Objects;
import java.util.Optional;

/**
 * An immutable list of {@link BallCompletedEvent} objects and their total score.
 */
public final class Balls implements Iterable {
    private final ImmutableList balls;
    private final Score score;

    Balls() {
        this(ImmutableList.emptyList(), Score.EMPTY);
    }

    private Balls(ImmutableList balls, Score score) {
        this.balls = Objects.requireNonNull(balls);
        this.score = Objects.requireNonNull(score);
    }

    /**
     * @return The total score of all the balls in this list
     */
    public Score score() {
		return score;
	}

    /**
     * @return The balls as an immutable list
     */
    public ImmutableList list() {
        return balls;
    }

    Balls add(BallCompletedEvent ball) {
        return new Balls(balls.add(ball), score.add(ball.score()));
    }

    /**
     * @return The number of balls bowled (including invalid balls such as wides)
     */
    public int size() {
        return balls.size();
    }

    @Override
    public String toString() {
        return balls.size() + " (" + score.teamRuns() + " runs)";
    }

    @Override
    public Iterator iterator() {
        return balls.iterator();
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Balls balls1 = (Balls) o;
        return balls.equals(balls1.balls);
    }

    @Override
    public int hashCode() {
        return Objects.hash(balls);
    }

    /**
     * @return The last valid ball in this list, or empty if there are none
     */
    public Optional lastValid() {
        Iterator ballIterator = list().reverseIterator();
        while (ballIterator.hasNext()) {
            BallCompletedEvent next = ballIterator.next();
            if (next.isValid()) {
                return Optional.of(next);
            }
        }
        return Optional.empty();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy