#lang racket
(require gigls/unsafe)
(provide (all-defined-out))

;;; File:
;;;   preconditions-lab.scm
;;; Authors:
;;;   Janet Davis
;;;   Samuel A. Rebelsky
;;;   Jerod Weinman
;;;   YOUR NAME HERE
;;; Summary:
;;;   Code for the lab entitled "Verifying Preconditions"

; +--------------------+--------------------------------------------------------
; | Comparing Drawings |
; +--------------------+

;;; Procedure:
;;;   drawing-leftmost
;;; Parameters:
;;;   drawing1, a drawing
;;;   drawing2, a drawing
;;; Purpose:
;;;   Determine the leftmost of drawing1 and drawing2.
;;; Produces:
;;;   leftmost, a drawing.
;;; Preconditions:
;;;   drawing1 and drawing2 have the correct form for drawings.
;;; Postconditions:
;;;   leftmost is equal to either drawing1 or drawing2.
;;;   leftmost either begins in the same column as both drawing1 and 
;;;     drawing2 or begins in the same column as one, and begins to the 
;;;     left of the other.
(define drawing-leftmost
  (lambda (drawing1 drawing2)
    (if (< (drawing-left drawing1) (drawing-left drawing2))
        drawing1
        drawing2)))

;;; Procedure:
;;;   drawings-leftmost
;;; Parameters:
;;;   drawings, a list of drawings
;;; Purpose:
;;;   Find the leftmost drawing in drawings.
;;; Produces:
;;;   leftmost, a drawing.
;;; Preconditions:
;;;   drawings is nonempty.
;;;   drawings contains only drawings.
;;; Postconditions:
;;;   leftmost is an element of drawings. 
;;;   For each drawing, d, in drawings. 
;;;     (drawing-left leftmost) <= (drawing-left d)
(define drawings-leftmost
  (lambda (drawings)
    (when (or (not (list? drawings))
              (null? drawings)
              (not (all-drawings? drawings)))
      (error "drawings-leftmost: requires a non-empty list of drawings, given " 
              drawings))
    (if (null? (cdr drawings))
        (car drawings)
        (drawing-leftmost (car drawings) 
                          (drawings-leftmost (cdr drawings))))))

