From 5f62bb319ee3fe337342f2fb079b3ec28010f484 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dominik=20Pant=C5=AF=C4=8Dek?= Date: Sun, 19 Mar 2023 18:55:32 +0100 Subject: [PATCH] Use month data type for joined key. --- member-file.scm | 23 ++++++++++++++++++----- members-base.scm | 16 +++++++++++++--- month.scm | 5 +++++ 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/member-file.scm b/member-file.scm index fd8bb4e..3592102 100644 --- a/member-file.scm +++ b/member-file.scm @@ -30,6 +30,7 @@ ( *member-file-context* *member-file-check-syntax* + *member-default-joined* load-member-file member-file-tests! ) @@ -63,6 +64,8 @@ ;; 'quiet - ignore (define *member-file-check-syntax* (make-parameter 'error)) + (define *member-default-joined* (make-parameter (make-month 2015 1))) + ;; Derived keys (define start/stop-keys-keys (map @@ -233,19 +236,29 @@ m) (cdr ks)))))) + ;; Converts given key to month if it is a string. Leaves untouched + ;; otherwise. + (define (convert-member-key:month m k) + (let ((v (dict-ref m k))) + (if (string? v) + (dict-set m k (string->month v)) + m))) + ;; All conversions in one place (define (convert-member-keys m) - (convert-member-keys:card - (convert-member-key:credit - (convert-member-keys:markers->periods m 'suspend 'student)) - 'card 'desfire)) + (convert-member-key:month + (convert-member-keys:card + (convert-member-key:credit + (convert-member-keys:markers->periods m 'suspend 'student)) + 'card 'desfire) + 'joined)) ;; Fills-in the defaults (define (make-default-member-info) (dict-set (make-dict) 'joined - "2015-01")) + (*member-default-joined*))) ;; Processes all lines and returns a dictionary representing given ;; member. diff --git a/members-base.scm b/members-base.scm index 88e4572..e1de064 100644 --- a/members-base.scm +++ b/members-base.scm @@ -53,7 +53,8 @@ member-file primes member-record - ansi) + ansi + period) ;; Gets all files and symbolic links from given directory. The ;; symbolic links are represented by cons cells with car being the @@ -273,8 +274,17 @@ (di4 (dict-set di3 'students (filter-members-by-predicate mb member-student?))) (di5 (dict-set di4 'destroyed - (filter-members-by-predicate mb member-destroyed?)))) - di5)) + (filter-members-by-predicate mb member-destroyed?))) + (di6 (dict-set di5 'month (*current-month*)))) + di6)) + + ;; Returns a list two lists: keys, data. + ;; Each data record contains values for all keys. + (define (members-base-stats . args) + (let ((keys '(month total active suspended students destroyed invalid))) + (let mloop ((data '()) + (month '(2015 1))) ; TODO: *oldest-month* + #f))) ;; Basic information about members-base in human-readable form. (define (print-members-base-info mb) diff --git a/month.scm b/month.scm index 3a4def4..0c12d46 100644 --- a/month.scm +++ b/month.scm @@ -28,6 +28,7 @@ (module month ( + make-month month-valid? string->month month->string @@ -44,6 +45,10 @@ (chicken format) testing) + ;; Simple wrapper for creating month representation as a list. + (define (make-month y m) + (list y m)) + ;; Returns true if this is a valid month representation - a list with ;; two integer elements within the allowed range. (define (month-valid? m)