-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathmodel.lisp
52 lines (41 loc) · 1.25 KB
/
model.lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
(defpackage :simple-users-model
(:use :cl)
(:export
:get-user
:all-users
:add-user
:update-user
:delete-user))
(in-package :simple-users-model)
(defparameter *user-id* 1)
(defvar *users* nil)
(defun make-user (id realname)
(list (cons :id id)
(cons :realname realname)))
(defun user-id (user)
(cdr (assoc :id user)))
(defun user-realname (user)
(cdr (assoc :realname user)))
(defun set-user-realname (user realname)
(setf (cdr (assoc :realname user)) realname))
(defun add-user (realname)
(let ((user (make-user (incf *user-id*)
realname)))
(push user
*users*)
user))
(defun update-user (user)
(delete-user (user-id user))
(push user *users*))
(defun get-user (id)
(find id *users* :key (lambda (user)
(cdr (assoc :id user)))))
(defun delete-user (id)
(setf *users* (delete id *users* :test #'equalp :key #'first)))
(defun all-users (&optional offset segment)
(let ((users (copy-list *users*)))
(if offset
(apply #'subseq users (cons (min offset (length users))
(and segment (list (min (+ offset segment)
(length users))))))
users)))