#lang scheme/base (require scheme/contract) ;; Git design, following the docs in ;; http://eagain.net/articles/git-for-computer-scientists. ;; ;; I'm trying to straighten out my understanding of git's design ;; by trying to write equivalent data structure definitions. ;; Storage (define-struct Blob (bytes)) (define-struct Tree (files subdirs)) (define-struct File (filename mode blob)) (define-struct Subdir (filename tree)) (define-struct Commit (tree parents body)) (define-struct Ref (ref)) (define-struct Remoteref (ref)) (define-struct Tag (commit message sig)) ;; dag-node?: any -> boolean ;; Returns true if the datum is an element of the dag. (define (dag-node? datum) (ormap (lambda (f) (f datum)) (list Blob? Tree? Commit? Ref? Remoteref?))) ;; Contracts (provide/contract [struct Blob ([bytes bytes?])] [struct Tree ([files (listof File?)] [subdirs (listof Subdir?)])] [struct File ([filename bytes?] [mode number?] [blob Blob?])] [struct Subdir ([filename bytes?] [tree Tree?])] [struct Commit ([tree Tree?] [parents (listof Tree?)] [body bytes?])] [struct Ref ([ref dag-node?])] [struct Remoteref ([ref dag-node?])] [struct Tag ([commit Commit?] [message (or/c false/c bytes?)] [sig (or/c false/c bytes?)])])