K addSideCondition(K requires) { Optional<KApply> sideCondition = state.stream().reduce(BooleanUtils::and); if (!sideCondition.isPresent()) { return requires; } else if (requires.equals(BooleanUtils.TRUE) && sideCondition.isPresent()) { return sideCondition.get(); } else { return BooleanUtils.and(requires, sideCondition.get()); } }
/** * Adds lookups to the side condition in sorted order in which they must be performed. Lookups are * sorted based on dependencies between each other, but non-lookup operations appear in no * particular order with respect to the lookups. * * @param requires Previous side condition, if any. * @return Side condition generated by this compiler pass + previous side condition. */ K addSideCondition(K requires) { Optional<KApply> sideCondition = getSortedLookups().reduce(BooleanUtils::and); if (!sideCondition.isPresent()) { return requires; } else if (requires.equals(BooleanUtils.TRUE) && sideCondition.isPresent()) { return sideCondition.get(); } else { // we order lookups before the requires clause so that the fresh constant // matching side condition remains last. This is necessary in order to // ensure that fresh constants in rule RHSs are consecutive return BooleanUtils.and(sideCondition.get(), requires); } }