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

org.gradle.api.internal.provider.BiProvider Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2020 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.gradle.api.internal.provider;

import org.gradle.api.provider.Provider;

import javax.annotation.Nullable;
import java.util.function.BiFunction;

class BiProvider extends AbstractMinimalProvider {

    private final BiFunction combiner;
    private final ProviderInternal left;
    private final ProviderInternal right;

    public BiProvider(Provider left, Provider right, BiFunction combiner) {
        this.combiner = combiner;
        this.left = Providers.internal(left);
        this.right = Providers.internal(right);
    }

    @Override
    public ExecutionTimeValue calculateExecutionTimeValue() {
        return isChangingValue(left) || isChangingValue(right)
            ? ExecutionTimeValue.changingValue(this)
            : super.calculateExecutionTimeValue();
    }

    private boolean isChangingValue(ProviderInternal provider) {
        return provider.calculateExecutionTimeValue().isChangingValue();
    }

    @Override
    protected Value calculateOwnValue(ValueConsumer consumer) {
        Value lv = left.calculateValue(consumer);
        if (lv.isMissing()) {
            return lv.asType();
        }
        Value rv = right.calculateValue(consumer);
        if (rv.isMissing()) {
            return rv.asType();
        }
        return Value.of(combiner.apply(lv.get(), rv.get()));
    }

    @Nullable
    @Override
    public Class getType() {
        // Could do a better job of inferring this
        return null;
    }

    @Override
    public ValueProducer getProducer() {
        return new PlusProducer(left.getProducer(), right.getProducer());
    }
}