private static IOrderedDataProducer <TSource> OrderBy <TSource, TKey>(IDataProducer <TSource> source, Func <TSource, TKey> selector, IComparer <TKey> comparer, bool descending)
    {
        source.ThrowIfNull("source");
        comparer.ThrowIfNull("comparer");

        IComparer <TSource> itemComparer = new ProjectionComparer <TSource, TKey>(selector, comparer);

        switch (descending)
        {
        case true:
            itemComparer = itemComparer.Reverse();
            break;
        }

        // first, discard any existing "order by"s by going back to the producer
        IOrderedDataProducer <TSource> orderedProducer;
        bool first = true;

        while ((orderedProducer = source as IOrderedDataProducer <TSource>) != null)
        {
            switch (first)
            {
            case true:
                // keep the top-most comparer to enforce a balanced sort
                itemComparer = new LinkedComparer <TSource>(itemComparer, orderedProducer.Comparer);
                first        = false;
                break;
            }

            source = orderedProducer.BaseProducer;
        }
        return(new OrderedDataProducer <TSource>(source, itemComparer));
    }
        public static TSource MaxBy <TSource, TKey>(this IEnumerable <TSource> source,
                                                    Func <TSource, TKey> selector, IComparer <TKey> comparer)
        {
            source.ThrowIfNull("source");
            selector.ThrowIfNull("selector");
            comparer.ThrowIfNull("comparer");

            using (IEnumerator <TSource> sourceIterator = source.GetEnumerator())
            {
                if (!sourceIterator.MoveNext())
                {
                    throw new InvalidOperationException("Sequence was empty");
                }

                TSource max    = sourceIterator.Current;
                TKey    maxKey = selector(max);

                while (sourceIterator.MoveNext())
                {
                    TSource candidate          = sourceIterator.Current;
                    TKey    candidateProjected = selector(candidate);

                    if (comparer.Compare(candidateProjected, maxKey) > 0)
                    {
                        max    = candidate;
                        maxKey = candidateProjected;
                    }
                }

                return(max);
            }
        }
        /// <summary>
        /// Create a new LinkedComparer
        /// </summary>
        /// <param name="primary">The first comparison to use</param>
        /// <param name="secondary">The next level of comparison if the primary returns 0 (equivalent)</param>
        public LinkedComparer(IComparer <T> primary, IComparer <T> secondary)
        {
            primary.ThrowIfNull("primary");
            secondary.ThrowIfNull("secondary");

            this.primary   = primary;
            this.secondary = secondary;
        }
        private static IOrderedDataProducer <TSource> ThenBy <TSource, TKey>(IOrderedDataProducer <TSource> source, DotNet20.Func <TSource, TKey> selector, IComparer <TKey> comparer, bool descending)
        {
            comparer.ThrowIfNull("comparer");
            IComparer <TSource> itemComparer = new ProjectionComparer <TSource, TKey>(selector, comparer);

            if (descending)
            {
                itemComparer = itemComparer.Reverse();
            }
            itemComparer = new LinkedComparer <TSource>(source.Comparer, itemComparer);
            return(new OrderedDataProducer <TSource>(source, itemComparer));
        }
Beispiel #5
0
        public BundleContents GetContents(IFileSystem fileSystem, IComparer <AssetFile> assetOrder, IEnumerable <IAssetTransformer> transformers)
        {
            fileSystem.ThrowIfNull("fileSystem");
            assetOrder.ThrowIfNull("assetOrder");
            transformers.ThrowIfNull("transformers");

            AssetFile[] orderedAssets = _assets
                                        .SelectMany(arg => arg.ResolveAssetFiles(fileSystem))
                                        .OrderBy(arg => arg, assetOrder)
                                        .ToArray();

            return(GetContents(fileSystem, orderedAssets, new DelimiterConcatenator(), transformers));
        }
        public BundleWatcher(Bundle bundle, IFileSystem fileSystem, IComparer<AssetFile> assetOrder, IEnumerable<IAssetTransformer> transformers)
        {
            bundle.ThrowIfNull("bundle");
            fileSystem.ThrowIfNull("fileSystem");
            assetOrder.ThrowIfNull("assetOrder");
            transformers.ThrowIfNull("transformers");

            _bundle = bundle;
            _assetOrder = assetOrder;
            _transformers = transformers.ToArray();
            _fileSystem = fileSystem;
            _watchTimer.Elapsed += WatchTimerElapsed;
            RefreshContents();
            WatchForChanges();
        }
Beispiel #7
0
        public BundleWatcher(Bundle bundle, IFileSystem fileSystem, IComparer <AssetFile> assetOrder, IEnumerable <IAssetTransformer> transformers)
        {
            bundle.ThrowIfNull("bundle");
            fileSystem.ThrowIfNull("fileSystem");
            assetOrder.ThrowIfNull("assetOrder");
            transformers.ThrowIfNull("transformers");

            _bundle              = bundle;
            _assetOrder          = assetOrder;
            _transformers        = transformers.ToArray();
            _fileSystem          = fileSystem;
            _watchTimer.Elapsed += WatchTimerElapsed;
            RefreshContents();
            WatchForChanges();
        }
Beispiel #8
0
        public static IEnumerable <T> Merge <T>(this IEnumerable <IOrderedEnumerable <T> > sources, IComparer <T> comparer)
        {
            sources.ThrowIfNull("sources");
            comparer.ThrowIfNull("comparer");
            var items = sources.Select(s => s.GetEnumerator()).ToArray();

            if (items.Length > 1)
            {
                Comparison <Tuple <int, T> > comparison = (a, b) => comparer.Compare(a.Item2, b.Item2);

                // Create heap
                var heap = new BinaryHeap <Tuple <int, T> >(items.Length, new ComparisonComparer <Tuple <int, T> >(comparison));
                // Populate heap
                for (var i = 0; i < items.Length; i++)
                {
                    if (items[i].MoveNext())
                    {
                        heap.Add(Tuple.Create(i, items[i].Current));
                    }
                }
                // Read from heap
                while (heap.Count > 0)
                {
                    var tuple = heap.Remove();
                    yield return(tuple.Item2);

                    if (items[tuple.Item1].MoveNext())
                    {
                        heap.Add(Tuple.Create(tuple.Item1, items[tuple.Item1].Current));
                    }
                    else
                    {
                        var item = items.Select((s, i) => new { Source = s, Index = i }).FirstOrDefault(a => a.Source.MoveNext());
                        if (item != null)
                        {
                            heap.Add(Tuple.Create(item.Index, item.Source.Current));
                        }
                    }
                }
            }
            else if (items.Length == 1)
            {
                while (items[0].MoveNext())
                {
                    yield return(items[0].Current);
                }
            }
        }
Beispiel #9
0
		public BundleRoute(Bundle bundle, string routeName, string relativePath, IComparer<AssetFile> assetOrder, IAssetConcatenator concatenator, IEnumerable<IAssetTransformer> transformers)
		{
			bundle.ThrowIfNull("bundle");
			routeName.ThrowIfNull("routeName");
			relativePath.ThrowIfNull("relativePath");
			assetOrder.ThrowIfNull("assetOrder");
			concatenator.ThrowIfNull("concatenator");
			transformers.ThrowIfNull("transformers");

			_bundle = bundle;
			_routeName = routeName;
			_relativePath = relativePath;
			_assetOrder = assetOrder;
			_concatenator = concatenator;
			_transformers = transformers;
		}
Beispiel #10
0
        public BundleRoute(Bundle bundle, string routeName, string relativePath, IComparer <AssetFile> assetOrder, IAssetConcatenator concatenator, IEnumerable <IAssetTransformer> transformers)
        {
            bundle.ThrowIfNull("bundle");
            routeName.ThrowIfNull("routeName");
            relativePath.ThrowIfNull("relativePath");
            assetOrder.ThrowIfNull("assetOrder");
            concatenator.ThrowIfNull("concatenator");
            transformers.ThrowIfNull("transformers");

            _bundle       = bundle;
            _routeName    = routeName;
            _relativePath = relativePath;
            _assetOrder   = assetOrder;
            _concatenator = concatenator;
            _transformers = transformers;
        }
        public AutoRouteCollection JavaScriptBundle(Bundle bundle, string routeName, Scheme scheme, string relativePath, IComparer <AssetFile> assetOrder, IAssetConcatenator concatenator, IEnumerable <IAssetTransformer> transformers)
        {
            ThrowIfNoContainer();

            bundle.ThrowIfNull("bundle");
            routeName.ThrowIfNull("routeName");
            relativePath.ThrowIfNull("relativePath");
            assetOrder.ThrowIfNull("assetOrder");
            concatenator.ThrowIfNull("concatenator");
            transformers.ThrowIfNull("transformers");

            var watcher     = new BundleWatcher(bundle, _container.GetInstance <IFileSystem>(), assetOrder, concatenator, transformers);
            var guidFactory = _container.GetInstance <IGuidFactory>();
            var httpRuntime = _container.GetInstance <IHttpRuntime>();
            var systemClock = _container.GetInstance <ISystemClock>();
            var route       = new JavaScriptBundleWatcherRoute(routeName, guidFactory.Random(), scheme, relativePath, watcher, httpRuntime, systemClock);

            return(AdditionalRoutes(route));
        }
Beispiel #12
0
        public AutoRouteCollection CssBundle(Bundle bundle, string routeName, string relativePath, IComparer <AssetFile> assetOrder, IAssetConcatenator concatenator, IEnumerable <IAssetTransformer> transformers)
        {
            ThrowIfNoBundleDependencyContainer();

            bundle.ThrowIfNull("bundle");
            routeName.ThrowIfNull("routeName");
            relativePath.ThrowIfNull("relativePath");
            assetOrder.ThrowIfNull("assetOrder");
            concatenator.ThrowIfNull("concatenator");
            transformers.ThrowIfNull("transformers");

            var watcher = new BundleWatcher(bundle, _bundleDependencyContainer.GetInstance <IFileSystem>(), assetOrder, concatenator, transformers);
            var route   = new CssBundleWatcherRoute(
                routeName,
                _bundleDependencyContainer.GetInstance <IGuidFactory>(),
                relativePath,
                watcher,
                _bundleDependencyContainer.GetInstance <IHttpRuntime>(),
                _bundleDependencyContainer.GetInstance <ISystemClock>());

            return(AdditionalRoutes(route));
        }
 /// <summary>
 /// Creates a new reversing comparer.
 /// </summary>
 /// <param name="original">The original comparer to use for comparisons.</param>
 public ReverseComparer(IComparer <T> original)
 {
     original.ThrowIfNull("original");
     OriginalComparer = original;
 }
 public ReverseComparer(IComparer <T> original)
 {
     original.ThrowIfNull(nameof(original));
     OriginalComparer = original;
 }
Beispiel #15
0
        public BundleContents GetContents(IFileSystem fileSystem, IComparer<AssetFile> assetOrder, IEnumerable<IAssetTransformer> transformers)
        {
            fileSystem.ThrowIfNull("fileSystem");
            assetOrder.ThrowIfNull("assetOrder");
            transformers.ThrowIfNull("transformers");

            AssetFile[] orderedAssets = _assets
                .SelectMany(arg => arg.ResolveAssetFiles(fileSystem))
                .OrderBy(arg => arg, assetOrder)
                .ToArray();

            return GetContents(fileSystem, orderedAssets, new DelimiterConcatenator(), transformers);
        }
Beispiel #16
0
 public InverseComparer(IComparer <T> comparer)
 {
     _comparer = comparer.ThrowIfNull(nameof(comparer));
 }
Beispiel #17
0
 public ReverseComparer(IComparer <T> comparer)
 {
     comparer.ThrowIfNull("comparer");
     _comparer = comparer;
 }