;; ;; bank-account.scm ;; ;; Generic bank account records. ;; ;; ISC License ;; ;; Copyright 2023 Brmlab, z.s. ;; Dominik Pantůček ;; ;; Permission to use, copy, modify, and/or distribute this software ;; for any purpose with or without fee is hereby granted, provided ;; that the above copyright notice and this permission notice appear ;; in all copies. ;; ;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL ;; WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED ;; WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE ;; AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR ;; CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS ;; OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, ;; NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN ;; CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ;; (declare (unit bank-account)) (module bank-account ( make-bank-account bank-account-transactions bank-account-number bank-account-bank bank-account-insert make-bank-transaction bank-transaction-varsym bank-transaction-amount bank-transaction-currency ) (import scheme (chicken base)) ;; Bank account is represented as a list with list with the following ;; elements: list of transactions, account number, bank code. This ;; allows cheap transaction prepending. (define (make-bank-account number bank . maybe-transactions) (let ((transactions (if (null? maybe-transactions) '() (car maybe-transactions)))) (list transactions number bank))) ;; Trivial accessors (define bank-account-transactions car) (define bank-account-number cadr) (define bank-account-bank caddr) ;; Prepends given transaction to given bank account. It expects the ;; transactions list to be the first element of the bank account ;; list. (define (bank-account-insert account transaction) (cons (cons transaction (car account)) (cdr account))) ;; Creates a new bank transaction. The order of elements is ;; well-suited for fast access to commonly used fields. (define (make-bank-transaction id date amount currency varsym) (list varsym amount currency date id)) ;; Accessors for the fields actually used (define bank-transaction-varsym car) (define bank-transaction-amount cadr) (define bank-transaction-currency caddr) )