File: container-mixins.lisp

package info (click to toggle)
cl-containers 20170403-1
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 1,072 kB
  • ctags: 1,387
  • sloc: lisp: 8,341; makefile: 14
file content (44 lines) | stat: -rw-r--r-- 1,618 bytes parent folder | download | duplicates (4)
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
(in-package #:containers)

(defclass* filtered-container-mixin ()
  ((element-filter nil ia)
   (key-filter nil ia))
  (:export-slots element-filter))


(defmethod iterate-elements :around ((container filtered-container-mixin) fn)
  (let ((filter (element-filter container)))
    (if filter
      (call-next-method container 
                        (lambda (element)
                          (when (funcall filter element)
                            (funcall fn element))))
      (call-next-method container fn))))


(defmethod collect-elements :around ((container filtered-container-mixin)
                                     &key filter transform)
  (let ((element-filter (element-filter container)))
    (if element-filter
      (call-next-method container 
                        :filter (lambda (element)
                                  (when (funcall element-filter element)
                                    (or (not filter) (funcall filter element))))
                        :transform transform)
      (call-next-method container))))


(defmethod iterate-key-value :around ((container filtered-container-mixin) fn)
  (let ((element-filter (element-filter container))
        (key-filter (key-filter container)))
    (if (or element-filter key-filter)
      (call-next-method 
       container
       (lambda (k v)
         (when (and (or (not element-filter)
                        (and element-filter (funcall element-filter v)))
                    (or (not key-filter)
                        (and key-filter (funcall key-filter k))))
           (funcall fn k v))))
      (call-next-method))))