// Path: metrics-core/src/main/java/com/flozano/metrics/client/MetricValue.java
// public abstract class MetricValue {
// 	private final long value;
// 	private final String name;
// 	private final Double sampleRate;
// 	private final String suffix;
// 
// 	private final Tags tags;
// 
// 	protected MetricValue(String name, long value, Double sampleRate, String suffix, Tags tags) {
// 		this.name = requireNonNull(name);
// 		this.value = value;
// 		this.sampleRate = validateSampleRate(sampleRate);
// 		this.suffix = suffix;
// 		this.tags = tags == null ? Tags.empty() : tags;
// 	}
// 
// 	public boolean isSignRequiredInValue() {
// 		return false;
// 	}
// 
// 	public static Double validateSampleRate(Double sampleRate) {
// 		if (sampleRate == null) {
// 			return null;
// 		}
// 		if (sampleRate < 0 || sampleRate > 1) {
// 			throw new IllegalArgumentException("sample rate must be between 0 and 1");
// 		}
// 
// 		return sampleRate;
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public Double getSampleRate() {
// 		return sampleRate;
// 	}
// 
// 	public long getValue() {
// 		return value;
// 	}
// 
// 	public String getCode() {
// 		return suffix;
// 	}
// 
// 	public Tags getTags() {
// 		return tags;
// 	}
// 
// 	public abstract MetricValue withRate(double rate);
// 
// 	public abstract MetricValue withName(String string);
// 
// }


import static java.util.Objects.requireNonNull;
import java.util.function.UnaryOperator;
import com.flozano.metrics.client.MetricValue;
package com.flozano.metrics.client.util;




public final class DuplicateWithPrefixPreprocessor implements UnaryOperator<MetricValue[]> {

	private final String prefix;

	public DuplicateWithPrefixPreprocessor(String prefix) {
		this.prefix = requireNonNull(prefix);
	}

	@Override
	public MetricValue[] apply(MetricValue[] value) {
		if (value == null) {
			throw new IllegalArgumentException();
		}
		if (value.length == 0) {
			return value;
		}
		MetricValue[] processed = new MetricValue[value.length * 2];
		for (int i = 0; i < value.length; i++) {
			processed[i] = value[i];
			processed[i + value.length] = process(value[i]);
		}

		return processed;
	}

// Path: metrics-core/src/main/java/com/flozano/metrics/client/MetricValue.java
// public abstract class MetricValue {
// 	private final long value;
// 	private final String name;
// 	private final Double sampleRate;
// 	private final String suffix;
// 
// 	private final Tags tags;
// 
// 	protected MetricValue(String name, long value, Double sampleRate, String suffix, Tags tags) {
// 		this.name = requireNonNull(name);
// 		this.value = value;
// 		this.sampleRate = validateSampleRate(sampleRate);
// 		this.suffix = suffix;
// 		this.tags = tags == null ? Tags.empty() : tags;
// 	}
// 
// 	public boolean isSignRequiredInValue() {
// 		return false;
// 	}
// 
// 	public static Double validateSampleRate(Double sampleRate) {
// 		if (sampleRate == null) {
// 			return null;
// 		}
// 		if (sampleRate < 0 || sampleRate > 1) {
// 			throw new IllegalArgumentException("sample rate must be between 0 and 1");
// 		}
// 
// 		return sampleRate;
// 	}
// 
// 	public String getName() {
// 		return name;
// 	}
// 
// 	public Double getSampleRate() {
// 		return sampleRate;
// 	}
// 
// 	public long getValue() {
// 		return value;
// 	}
// 
// 	public String getCode() {
// 		return suffix;
// 	}
// 
// 	public Tags getTags() {
// 		return tags;
// 	}
// 
// 	public abstract MetricValue withRate(double rate);
// 
// 	public abstract MetricValue withName(String string);
// 
// }


// Path: metrics-core/src/main/java/com/flozano/metrics/client/util/DuplicateWithPrefixPreprocessor.java
import static java.util.Objects.requireNonNull;
import java.util.function.UnaryOperator;
import com.flozano.metrics.client.MetricValue;

package com.flozano.metrics.client.util;




public final class DuplicateWithPrefixPreprocessor implements UnaryOperator<MetricValue[]> {

	private final String prefix;

	public DuplicateWithPrefixPreprocessor(String prefix) {
		this.prefix = requireNonNull(prefix);
	}

	@Override
	public MetricValue[] apply(MetricValue[] value) {
		if (value == null) {
			throw new IllegalArgumentException();
		}
		if (value.length == 0) {
			return value;
		}
		MetricValue[] processed = new MetricValue[value.length * 2];
		for (int i = 0; i < value.length; i++) {
			processed[i] = value[i];
			processed[i + value.length] = process(value[i]);
		}

		return processed;
	}

	private MetricValue process(MetricValue metricValue) {