Module: sql-odbc-implementation Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND define class () slot grouped-source :: type-union(singleton(#"self"), ), required-init-keyword: grouped-source:; constant slot new-group :: , required-init-keyword: new-group:; // prototype: fn(collection :: , first-element :: ) // => (result :: ) constant slot group-finished? :: , required-init-keyword: group-finished?:; // prototype: fn(collection :: , current-group :: // element :: ) => (result :: ) constant slot grouper :: , required-init-keyword: grouper:; // prototype: fn(collection :: , current-group :: // element :: ) => () end class; define method initialize(c :: , #key) => () next-method(); if (c.grouped-source == #"self") c.grouped-source := c; end if; end method; define class () slot source-state :: , required-init-keyword: source-state:; slot current-group :: ; slot at-end? :: = #f; end class; define method forward-iteration-protocol(collection :: ) => (initial-state :: , limit :: , next-state :: , finished-state? :: , current-key :: , current-element :: , current-element-setter :: , copy-state :: ) let (source-initial-state :: , source-limit :: , source-next-state :: , source-finished? :: , source-current-key :: , source-element :: , source-element-setter :: , source-copy-state :: ) = if (collection.grouped-source == collection) next-method(); else forward-iteration-protocol(collection.grouped-source); end if; local method next-grouped-state(c :: , state :: , limit :: ) => (new-state :: ) if (source-finished?(c.grouped-source, state.source-state, limit)) state.at-end? := #t; else state.current-group := c.new-group(c, source-element(c.grouped-source, state.source-state)); state.source-state := source-next-state(c.grouped-source, state.source-state); while (~source-finished?(c.grouped-source, state.source-state, limit) & ~c.group-finished?(c, state.current-group, source-element(c.grouped-source, state.source-state))) c.grouper(c, state.current-group, source-element(c.grouped-source, state.source-state)); state.source-state := source-next-state(c.grouped-source, state.source-state); end while; end if; state; end method; local method get-initial-state(c :: , limit :: ) => (initial-state :: ) let state = make(, source-state: source-initial-state); next-grouped-state(c, state, limit); end method; local method next-state(c :: , state :: ) => (new-state :: ) //state.source-state := source-next-state(c.grouped-source, // state.source-state); next-grouped-state(c, state, source-limit); end method; local method finished-state?(c :: , state :: , limit :: ) => (finished? :: ) state.at-end?; //source-finished?(c.grouped-source, state.source-state, limit) end method; local method current-key(c :: , state :: ) => (key :: ) source-current-key(c.grouped-source, state.source-state); end method; local method current-element(c :: , state :: ) => (element :: ) state.current-group; end method; local method element-setter(value :: , c :: , state :: ) => (value :: ) source-element-setter(value, c.grouped-source, state.source-state); end method; local method copy-state(c :: , state :: ) => (new-state :: ) make(, source-state: copy-state(c.grouped-source, state.source-state)); end method; values(get-initial-state(collection, source-limit), source-limit, next-state, finished-state?, current-key, current-element, element-setter, copy-state); end method;