namespace Unosquare.Swan.Components
{
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
///
/// 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 bool ContainsKey(Type key) => _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.
///
/// type.
public IEnumerable Retrieve(Type key, Func> factory)
{
if (factory == null)
throw new ArgumentNullException(nameof(factory));
return _data.Value.GetOrAdd(key, k => factory.Invoke(k).Where(item => item != null));
}
}
}