package org.leumasjaffe.recipe.model; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Stream; import org.leumasjaffe.observer.Observable; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NonNull; @Data @EqualsAndHashCode(callSuper=false) public class Phase extends Observable.Instance implements CompoundRecipeComponent { int id = 0; // TODO Fix this int[] dependsOn = {}; // decltype(id)[] String vessel = ""; Optional preparation = Optional.empty(); List cooking = new ArrayList<>(); Optional rest = Optional.empty(); public Stream getIngredientsAsStream() { return cooking.stream().flatMap(RecipeComponent::getIngredientsAsStream); } // TODO Include Rest and Preparation public Stream getComponents() { return cooking.stream(); } public CollatedDuration getCollatedDuration() { final Duration prep = preparation.map(Preparation::getDuration).orElse(Duration.ZERO); final Duration rest = this.rest.map(Rest::getDuration).orElse(Duration.ZERO); final Duration cooking = this.cooking.stream().map(Step::getDuration) .reduce(Duration.ZERO, Duration::plus); return new CollatedDuration(prep, cooking, prep.plus(cooking).plus(rest)); } public void setPreparation(final @NonNull Preparation p) { preparation = Optional.of(new Preparation(p.duration, this::getIngredients)); } }