preserves/implementations/racket/preserves/preserves-schema/methods.rkt

46 lines
2.0 KiB
Racket

#lang racket/base
(provide gen:preservable
preservable?
->preserve
preservable/c)
(require preserves)
(require racket/generic)
(require racket/set)
(require racket/dict)
(define-generics preservable
(->preserve preservable)
#:fast-defaults ([boolean? (define (->preserve preservable) preservable)]
[number? (define (->preserve preservable) preservable)]
[string? (define (->preserve preservable) preservable)]
[bytes? (define (->preserve preservable) preservable)]
[symbol? (define (->preserve preservable) preservable)]
[null? (define (->preserve preservable) preservable)]
[pair?
(define/generic *->preserve ->preserve)
(define (->preserve preservable) (map *->preserve preservable))]
[hash?
(define/generic *->preserve ->preserve)
(define (->preserve preservable)
(for/hash [((k v) (in-hash preservable))]
(values (*->preserve k) (*->preserve v))))])
#:defaults ([float? (define (->preserve preservable) preservable)]
[embedded? (define (->preserve preservable) preservable)]
[record?
(define/generic *->preserve ->preserve)
(define (->preserve preservable)
(record (*->preserve (record-label preservable))
(map *->preserve (record-fields preservable))))]
[set?
(define/generic *->preserve ->preserve)
(define (->preserve preservable)
(for/set [(v (in-set preservable))]
(*->preserve v)))]
[dict?
(define/generic *->preserve ->preserve)
(define (->preserve preservable)
(for/hash [((k v) (in-dict preservable))]
(values (*->preserve k) (*->preserve v))))]))