comprehensions.ss
;;; comprehensions.ss

; This file provides set-ec and :set. They were put in this file
; in order to avoid any the prefix from, say,
;   (require (prefix set: (planet "set.ss" ("cce" "galore.plt" 1))))

(module comprehensions mzscheme
  (require (prefix set: "set.ss")
           (lib "42.ss" "srfi"))
  
  (provide set-ec :set)
  
  ;;;
  ;;; SRFI 42 SUPPORT
  ;;;
  
  (require (lib "42.ss" "srfi"))
  
  (define-syntax set-ec
    (syntax-rules ()
      [(_ empty etc1 etc ...)
       (fold-ec empty etc1 etc ... set:insert)]))
  
  (define-syntax :set
    (syntax-rules (index)
      ((:set cc var (index i) arg)
       (:parallel cc (:stack var arg) (:integers i)) )
      ((:set cc var arg)
       (:do cc
            (let ())
            ((s arg))
            (not (set:empty? s))
            (let ((var (set:select s))))
            #t
            ((set:remove var s))
            ))))
  
  (define (:set-dispatch args)
    (cond
      [(null? args)
       'set]
      [(and (= (length args) 1)
            (set:set? (car args)))
       (:generator-proc (:set (car args)))]
      [else
       #f]))
  
  (:-dispatch-set! 
   (dispatch-union (:-dispatch-ref) :set-dispatch)))