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

io.github.oliviercailloux.grade.GradePenalizer Maven / Gradle / Ivy

The newest version!
package io.github.oliviercailloux.grade;

import static com.google.common.base.Preconditions.checkNotNull;

import com.google.common.collect.ImmutableMap;
import io.github.oliviercailloux.grade.DeadlineGrader.LinearPenalizer;
import java.time.Duration;
import java.time.Instant;
import java.util.function.Function;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class GradePenalizer implements GradeModifier {
  @SuppressWarnings("unused")
  private static final Logger LOGGER = LoggerFactory.getLogger(GradePenalizer.class);

  public static final Criterion C_MAIN = Criterion.given("Main");

  public static final Criterion C_LATENESS = Criterion.given("Timing");

  public static GradePenalizer using(LinearPenalizer penalizer, Instant deadline) {
    return new GradePenalizer(penalizer::getFractionRemaining, deadline);
  }

  public static GradePenalizer usingFunction(Function penalizer, Instant deadline) {
    return new GradePenalizer(penalizer, deadline);
  }

  private final Function penalizer;

  private final Instant deadline;

  private GradePenalizer(Function penalizer, Instant deadline) {
    this.penalizer = checkNotNull(penalizer);
    this.deadline = checkNotNull(deadline);
  }

  @Override
  public MarksTree modify(MarksTree original, Instant timeCap) {
    final Duration lateness = Duration.between(deadline, timeCap);
    final Mark remaining = penalizer.apply(lateness);
    LOGGER.debug("Lateness from {} to {} equal to {}; remaining {}.", deadline, timeCap, lateness,
        remaining);

    return MarksTree.composite(ImmutableMap.of(C_MAIN, original, C_LATENESS, remaining));
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy