/* * Copyright (c) 2003-2008 The University of Wroclaw. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the University may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN * NO EVENT SHALL THE UNIVERSITY BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ namespace Nemerle.Collections { /** * The state of a list enumerator. */ internal enum ListEnumState { | BeforeFirst | Correct | AfterLast } /** * An enumerator for lists. */ public class ListEnumerator ['a] : System.Collections.Generic.IEnumerator ['a], ICovariantEnumerator ['a] { /* -- PUBLIC CONSTRUCTORS ----------------------------------------------- */ public this (l : list ['a]) { m_list = l; Reset () } Dispose () : void implements System.IDisposable.Dispose { } /* -- PUBLIC METHODS ---------------------------------------------------- */ public MoveNext () : bool { def doMove() : bool { match (m_rest) { | hd :: tl => m_current = hd; m_rest = tl; true | _ => m_state = ListEnumState.AfterLast; false } } match (m_state) { | ListEnumState.BeforeFirst => m_state = ListEnumState.Correct; doMove () | ListEnumState.Correct => doMove () | ListEnumState.AfterLast => false } } public Reset () : void { m_rest = m_list; m_state = ListEnumState.BeforeFirst; } /* -- PUBLIC PROPERTIES ------------------------------------------------- */ public Current : 'a { get { match (m_state) { | ListEnumState.Correct => m_current | ListEnumState.BeforeFirst | ListEnumState.AfterLast => throw System.InvalidOperationException () } } } /* -- PRIVATE FIELDS ---------------------------------------------------- */ private mutable m_list : list ['a]; private mutable m_current : 'a; private mutable m_rest : list ['a]; private mutable m_state : ListEnumState; } }