2009-03-28 Jb Evain <jbevain@novell.com>
[mono.git] / mcs / class / System.Core / System.Linq / OrderedEnumerable.cs
index a6131b2203f29e4aab39d8d36f2d13e5d97d6566..b7e90f2ba51d86f39cc3e135ac6177b248fafd8a 100644 (file)
@@ -1,10 +1,11 @@
 //
-// AOrderedEnumerable.cs
+// OrderedEnumerable.cs
 //
 // Authors:
 //     Marek Safar  <marek.safar@gmail.com>
+//     Jb Evain  <jbevain@novell.com>
 //
-// Copyright (C) 2007 Novell, Inc (http://www.novell.com)
+// Copyright (C) 2007 - 2008 Novell, Inc (http://www.novell.com)
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // a copy of this software and associated documentation files (the
@@ -30,26 +31,36 @@ using System;
 using System.Collections;
 using System.Collections.Generic;
 
-namespace System.Linq
-{
-        abstract class AOrderedEnumerable<TElement> : IOrderedEnumerable<TElement>
-        {
-               protected AOrderedEnumerable<TElement> parent;
-                       
-               public abstract IEnumerator<TElement> GetEnumerator ();
-                public abstract IEnumerable<TElement> Sort (IEnumerable<TElement> parentSource);
-                
+namespace System.Linq {
+
+       abstract class OrderedEnumerable<TElement> : IOrderedEnumerable<TElement> {
+
+               IEnumerable<TElement> source;
+
+               protected OrderedEnumerable (IEnumerable<TElement> source)
+               {
+                       this.source = source;
+               }
+
                IEnumerator IEnumerable.GetEnumerator ()
                {
                        return GetEnumerator ();
                }
-                        
+
+               public IEnumerator<TElement> GetEnumerator ()
+               {
+                       return Sort (source).GetEnumerator ();
+               }
+
+               public abstract SortContext<TElement> CreateContext (SortContext<TElement> current);
+
+               protected abstract IEnumerable<TElement> Sort (IEnumerable<TElement> source);
+
                public IOrderedEnumerable<TElement> CreateOrderedEnumerable<TKey> (
                        Func<TElement, TKey> selector, IComparer<TKey> comparer, bool descending)
                {
-                       parent = new InternalOrderedSequence<TElement, TKey> (this, selector, comparer, descending);
-                       return parent;
+                       return new OrderedSequence<TElement, TKey> (this, source, selector, comparer,
+                               descending ? SortDirection.Descending : SortDirection.Ascending);
                }
-        }
+       }
 }
-