Module:       Dylan-User
Synopsis:     DUIM utilities
Author:       Scott McKay, Andy Armstrong
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 module duim-imports
  // Export useful functionality that DUIM needs from other libraries
  use functional-extensions,
    exclude: { position },
    export: all;
  use dylan-extensions,
    import: { <keyboard-interrupt>,
	      \without-bounds-checks,
	      element-no-bounds-check,
	      element-no-bounds-check-setter,
	      element-range-error },
    export: { <keyboard-interrupt>,
	      \without-bounds-checks,
	      element-no-bounds-check,
	      element-no-bounds-check-setter,
	      element-range-error };
  use simple-debugging, export: all;
  use simple-format, export: all;
  use threads, export: all;
  use transcendentals, export: all;
  use table-extensions, exclude: { table }, export: all;
  use plists, export: all;
end module duim-imports;

define module duim-utilities
  use dylan;
  use duim-imports;

  // Debug support
  export *debug-duim-function*,
         duim-debug-message;

  //--- Per-thread (i.e., dynamically bindable) slots
  export \thread-slot-definer;

  //--- A bit more support for threads
  export destroy-thread;

  // Floating point constants
  export $pi, $2pi, $pi/2;

  // "Declarations"
  export dynamic-extent;

  // Protocol definer
  export \protocol-class-definer,
         \protocol-predicate-definer,
	 \protocol-definer;

  // Useful stuff
  export \inc!, \dec!,
         \min!, \max!,
         \push!, \pop!,
	 \swap!,
         \destructuring-let,
         \simple-restart-loop,
	 \with-abort-restart,
         \with-abort-restart-loop,
         \with-restart,
         \with-simple-restart,
         warn;

  // Characters and strings
  create char-equal?,   char-less?,   char-greater?,
         string-equal?, string-less?, string-greater?,
         alpha-char?, digit-char?, alphanumeric-char?,
         upper-case?, lower-case?,
         graphic-char?, standard-char?, whitespace-char?,
         string-capitalize, string-capitalize!,
	 string-pluralize, string-a-or-an;

  // Stack allocation
  export \with-stack-list, evacuate-list,
	 \with-stack-object, evacuate-object,
         \with-stack-vector, evacuate-vector;

  export gethash, gethash-setter,
         remhash,
	 <string-or-object-table>,
         substitute, substitute!,
         insert-at!, remove-at!,
	 find-pair,
	 position, count,
         make-array-from-contents, fill-array!,
	 range-check;

  //--- Need a way to cheaply get the current time in microseconds
  export get-internal-real-time;

end module duim-utilities;