;; -*- Mode: Irken -*- (include "lib/core.scm") (include "lib/pair.scm") (include "lib/alist.scm") (include "lib/stack.scm") ;; sort a collection into lists with matching

;;

must return an eq?-compatible object. returns an alist of stacks. (define (collect p l) (let loop ((acc (alist/make)) (l l)) (match l with () -> acc (hd . tl) -> (let ((key (p hd))) (match (alist/lookup acc key) with (maybe:no) -> (let ((stack (make-stack))) (stack.push hd) (loop (alist:entry key stack acc) tl)) (maybe:yes stack) -> (begin (stack.push hd) (loop acc tl))))))) (datatype test (:red) (:green) (:blue) ) (define R (test:red)) (define G (test:green)) (define B (test:blue)) (define test->color (test:red) -> 'red (test:green) -> 'green (test:blue) -> 'blue ) (let ((l (LIST R G B B R R G G B))) (alist/iterate (lambda (k v) (printn (v.get))) (collect test->color l)))