aboutsummaryrefslogtreecommitdiff
path: root/advent-of-code/2023/lib/obj.rkt
diff options
context:
space:
mode:
Diffstat (limited to 'advent-of-code/2023/lib/obj.rkt')
-rw-r--r--advent-of-code/2023/lib/obj.rkt32
1 files changed, 32 insertions, 0 deletions
diff --git a/advent-of-code/2023/lib/obj.rkt b/advent-of-code/2023/lib/obj.rkt
new file mode 100644
index 0000000..9217976
--- /dev/null
+++ b/advent-of-code/2023/lib/obj.rkt
@@ -0,0 +1,32 @@
+#lang racket
+
+(provide obj-maker
+ obj-set
+ obj-show)
+
+(define (alist->obj alist)
+ (lambda key
+ (if (null? key)
+ alist
+ (cadr (assoc (car key) alist)))))
+
+(define (obj-maker . fields)
+ (lambda inits
+ (define alist (map list fields inits))
+ (alist->obj alist)))
+
+(define (obj-set record key value)
+ (define alist (record))
+ (define new-alist
+ (let loop ((new-list '()) (cur alist) (is-set #f))
+ (if (null? cur)
+ (if is-set
+ new-list
+ (cons (list key value) new-list))
+ (let ()
+ (if (eq? key (caar cur))
+ (loop (cons (list key value) new-list) (cdr cur) #t)
+ (loop (cons (car cur) new-list) (cdr cur) is-set))))))
+ (alist->obj new-alist))
+
+(define (obj-show x) (x)) \ No newline at end of file