Module: internal Author: Gail Zacharias 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 // Ordered explicit key collections. // // This doesn't support deletion of elements, and it's also not threads safe define abstract class (, ) constant slot key-sequence :: = make(); end; define sealed domain key-sequence(); define sealed generic ordered-mapping (tab :: ) => (table :: ); define sealed inline method size (tab :: ) => (size :: ) tab.ordered-mapping.size end method size; define sealed inline method remove-all-keys! (tab :: ) remove-all-keys!(tab.ordered-mapping); tab.key-sequence.size := 0; end method remove-all-keys!; define sealed inline method element (tab :: , key, #key default = unsupplied()) => (key-or-default :: ) if (supplied?(default)) element(tab.ordered-mapping, key, default: default) else element(tab.ordered-mapping, key) end; end method element; define sealed inline method element-setter (value , tab :: , key) => (value) let table = tab.ordered-mapping; if (not-found?(element(table, key, default: not-found()))) add!(tab.key-sequence, key); end; table[key] := value; end; define sealed inline method forward-iteration-protocol (tab :: ) => (init :: , lim :: , next :: , finished? :: , key :: , elt :: , elt-setter :: , copy :: ) local method next (tab, index :: ) index + 1 end; local method finished? (tab, index :: , size :: ) index == size end; local method key (tab :: , index :: ) tab.key-sequence[index] end; local method elt (tab :: , index :: ) element(tab.ordered-mapping, tab.key-sequence[index]) end; local method elt-setter (tab :: , index :: ) element(tab.ordered-mapping, tab.key-sequence[index]) end; local method copy (tab, index :: ) index end; values(0, tab.key-sequence.size, next, finished?, key, elt, elt-setter, copy) end; define class () constant slot ordered-mapping :: = make(), init-keyword: table:; end; define class () constant slot ordered-mapping :: = make(), init-keyword: table:; end; define class () constant slot ordered-mapping :: = make(), init-keyword: set:; end; define sealed inline method member? (object, tab :: , #key test) => (bool :: ) member?(object, tab.ordered-mapping) end; define sealed inline method add! (tab :: , key) => (tab :: ) let set = tab.ordered-mapping; unless (member?(key, set)) add!(tab.key-sequence, key); end; add!(set, key); tab end;