;; Copyright (C) 1996 DIMACS Center, Rutgers, The State University of New Jersey
;; Author(s): Jonathan Berry

;; This software is copyrighted by the DIMACS Center at Rutgers, The State
;; University of New Jersey.  IT IS PROVIDED AS IS, AND THE AUTHORS, DIMACS, AND
;; RUTGERS, THE STATE UNIVERSITY OF NEW JERSEY  DISCLAIM
;; ALL LIABILITY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
;; DAMAGES ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY
;; DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE
;; POSSIBILITY OF SUCH DAMAGE.

;; THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES,
;; INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY,
;; FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.  THIS SOFTWARE
;; IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE
;; NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
;; MODIFICATIONS.

;; The authors hereby grant permission to use, copy, modify, distribute,
;; and license this software and its documentation for any purpose, provided
;; that existing copyright notices are retained in all copies and that this
;; notice is included verbatim in any distributions. No written agreement,
;; license, or royalty fee is required for any of the authorized uses.
;; Modifications to this software may be copyrighted by their authors
;; and need not follow the licensing terms described here, provided that
;; the new terms are clearly indicated on the first page of each file where
;; they apply.

;; Last File Update: 31-Jul-1996
;; 

(define (long-string-append s1 s2)
	(cond ((not (and (string? s1) (string? s2))) 
			(error "long-string-append: bad arguments"))
	      (#t 
		   (if (> (remainder (string-length s1) 80) 65)
			(string-append s1 "\n" s2)
			(string-append s1 s2)))))

(define (vertex->string v)
	(string-append (find-string-attribute 'name v) " "))

(define (edge->string e)
	(collection-vertex->string (vertices e)))

(define-generic collection-vertex->string)
(define-method collection-vertex->string ((coll <collection<vertex*>>))
	(let ((s " "))
		(do ((i 0 (+ i 1)))
		    ((= i (size coll)) s)
		    (set! s (long-string-append 
				s (vertex->string (ref coll i)))))))

(define-method collection-vertex->string ((coll <mset<vertex*>>))
	(let ((s "{ "))
		(do ((i 0 (+ i 1)))
		    ((= i (size coll)) s)
		    (set! s (long-string-append 
				s (vertex->string (ref coll i)))))
		(set! s (string-append s "}"))s))

(define-method collection-vertex->string ((coll <set<vertex*>>))
	(let ((s "{ "))
		(do ((i 0 (+ i 1)))
		    ((= i (size coll)) s)
		    (set! s (long-string-append 
				s (vertex->string (ref coll i)))))
		(set! s (string-append s "}"))s))

(define-method collection-vertex->string ((coll <sequence<vertex*>>))
	(let ((s "< "))
		(do ((i 0 (+ i 1)))
		    ((= i (size coll)) s)
		    (set! s (long-string-append 
				s (vertex->string (ref coll i)))))
		(set! s (string-append s ">"))s))

(define-method collection-vertex->string ((coll <array<vertex*>>)
					     (g <graph*>))
	(let ((s "[ "))
		(do ((i 0 (+ i 1)))
		    ((= i (order g)) s)
		    (set! s (long-string-append 
				s (vertex->string 
					(vector-vertex-vector-ref coll i)))))
		(set! s (string-append s "]"))s))

(define (collection-edge->string es)
	(let ((s " "))
		(do ((i 0 (+ i 1)))
		    ((= i (size es)) s)
		    (set! s (long-string-append 
				s (collection-vertex->string 
					(vertices (ref es i))))))))

(define (graph->string g)
	(let ((s ""))
	  (set! s (string-append  "{" s))
	  (set! s (string-append s 
			(collection-vertex->string (vertex-vector g) g)))
	  (set! s (string-append  s "{"))
	  (set! s (long-string-append s 
			(collection-edge->string (edges g))))
	  (set! s (string-append s "}}"))s))

(provide "graph-string")
