EnumerationWithStatistics
using Relativity.DataTransfer.Nodes;
using Relativity.Transfer.Enumeration.Interfaces;
using Relativity.Transfer.Enumeration.Operators;
using System.Collections.Generic;
using System.Threading;
namespace Relativity.Transfer.Enumeration
{
internal class EnumerationWithStatistics : IEnumeratorProvider
{
private readonly IEnumeratorProvider _enumeratorProvider;
private readonly IEnumerationHandler<EnumerationStatistic> _statisticsHandler;
private long _totalFiles;
private long _totalBytes;
private long _totalEmptyDirectories;
public EnumerationWithStatistics(IEnumeratorProvider enumeratorProvider, IEnumerationHandler<EnumerationStatistic> statisticsHandler)
{
_enumeratorProvider = enumeratorProvider;
_statisticsHandler = statisticsHandler;
}
public IEnumerator<INode> GetEnumerator(IEnumerable<INode> nodes, CancellationToken token)
{
return _enumeratorProvider.GetEnumerator(nodes, token).OnNext(delegate(INode node) {
IFile file = node as IFile;
if (file == null) {
if (node is IDirectory)
_totalEmptyDirectories++;
} else {
_totalFiles++;
_totalBytes += file.Size;
}
_statisticsHandler.Report(new EnumerationStatistic(_totalFiles, _totalBytes, _totalEmptyDirectories));
}, token);
}
}
}