using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
namespace Swan.Collections {
///
/// A thread-safe collection cache repository for types.
///
/// The type of member to cache.
public class CollectionCacheRepository {
private readonly Lazy>> _data = new Lazy>>(() => new ConcurrentDictionary>(), true);
///
/// Determines whether the cache contains the specified key.
///
/// The key.
/// true if the cache contains the key, otherwise false.
public Boolean ContainsKey(Type key) => this._data.Value.ContainsKey(key);
///
/// Retrieves the properties stored for the specified type.
/// If the properties are not available, it calls the factory method to retrieve them
/// and returns them as an array of PropertyInfo.
///
/// The key.
/// The factory.
///
/// An array of the properties stored for the specified type.
///
///
/// key
/// or
/// factory.
///
/// type.
public IEnumerable Retrieve(Type key, Func> factory) {
if(key == null) {
throw new ArgumentNullException(nameof(key));
}
if(factory == null) {
throw new ArgumentNullException(nameof(factory));
}
return this._data.Value.GetOrAdd(key, k => factory.Invoke(k).Where(item => item != null));
}
}
}