/*-
 * Copyright 2017 Diamond Light Source Ltd.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 */

package org.eclipse.dawnsci.analysis.dataset;

import java.lang.ref.SoftReference;
import java.util.IdentityHashMap;
import java.util.Map;

import org.eclipse.dawnsci.analysis.dataset.impl.function.DatasetToDatasetFunction;
import org.eclipse.january.dataset.Dataset;
import org.eclipse.january.dataset.DatasetUtils;
import org.eclipse.january.dataset.IDataset;

/**
 * Cache of computed dataset values
 */
public class DatasetCache {

	private DatasetToDatasetFunction function;
	private Map<IDataset, SoftReference<Dataset>> map;

	/**
	 * Create a cache for given function
	 * @param function
	 */
	public DatasetCache(DatasetToDatasetFunction function) {
		this.function = function;
		map = new IdentityHashMap<IDataset, SoftReference<Dataset>>();
	}

	/**
	 * Retrieve computed value (evaluate if not cached)
	 * @param input
	 * @return computed value
	 */
	public Dataset get(IDataset input) {
		SoftReference<Dataset> ref = map.get(input);
		Dataset output;
		if (ref == null || ref.get() == null) {
			output = DatasetUtils.convertToDataset(function.value(input).get(0));
			map.put(input, new SoftReference<Dataset>(output));
		} else {
			output = ref.get();
		}
		return output;
	}

	/**
	 * Remove entry from cache
	 * @param input
	 * @return true if was cached
	 */
	public boolean remove(Dataset input) {
		SoftReference<Dataset> ref = map.remove(input);
		if (ref == null || ref.get() == null) {
			return false;
		}
		ref.clear();
		return true;
	}

	/**
	 * Clear cache
	 */
	public void clear() {
		map.clear();
	}
}

Add new cache to store computed datasets
Add new cache to store computed datasets