summaryrefslogtreecommitdiffstats
path: root/srfi/srfi-146-hash-impl.scm
blob: 609fce9a3637a1e6bb7c0a8704f2737eb3fecb1d (plain) (blame)
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
(define hash-mapping-dto
  (let ()

    (define (prep-dto-arg proc)
      (lambda (dto . args)
        (apply proc args)))
    
    (define (hashmap-map* dto proc dict)
      (hashmap-map (lambda (key value)
                     (values key (proc key value)))
                   (dict-comparator dto dict) dict))

    (define (hashmap-find-update* dto dict key failure success)
      (call/cc
        ;; escape from whole hashmap-search entirely, when success / failure
        ;; return something other than through passed in continuation procedures
        (lambda (k)
          (define-values
            (new-dict ignored)
            (hashmap-search dict key
                            (lambda (insert ignore)
                              ;; handle when continuation procedure is called
                              ;; and force it into tail call
                              (call/cc (lambda (k2)
                                         (define result
                                           ;; calls to insert / ignore / update / remove
                                           ;; can return unspecified amount of values,
                                           ;; hence call-with-values approach
                                           (failure (lambda (value) (call-with-values (lambda () (insert value #f)) k2))
                                                    (lambda () (call-with-values (lambda () (ignore #f)) k2))))
                                         ;; neither insert nor ignore called -- return result to top level escape
                                         (k result))))
                            (lambda (key value update remove)
                              (call/cc (lambda (k2)
                                         (define result
                                           (success
                                             key
                                             value
                                             (lambda (new-key new-value) (call-with-values (lambda () (update new-key new-value #f)) k2))
                                             (lambda () (call-with-values (lambda () (remove #f)) k2))))
                                         (k result))))))
          new-dict)))

    (make-dto
     dictionary?-id (prep-dto-arg hashmap?)
     dict-pure?-id (lambda _ #t)
     dict-map-id hashmap-map*
     dict-empty?-id (prep-dto-arg hashmap-empty?)
     dict-contains?-id (prep-dto-arg hashmap-contains?)
     dict-ref-id (prep-dto-arg hashmap-ref)
     dict-ref/default-id (prep-dto-arg hashmap-ref/default)
     dict-set-id (prep-dto-arg hashmap-set)
     dict-adjoin-id (prep-dto-arg hashmap-adjoin)
     dict-delete-id (prep-dto-arg hashmap-delete)
     dict-delete-all-id (prep-dto-arg hashmap-delete-all)
     dict-replace-id (prep-dto-arg hashmap-replace)
     dict-intern-id (prep-dto-arg hashmap-intern)
     dict-update-id (prep-dto-arg hashmap-update)
     dict-update/default-id (prep-dto-arg hashmap-update/default)
     dict-pop-id (prep-dto-arg hashmap-pop)
     dict-filter-id (prep-dto-arg hashmap-filter)
     dict-remove-id (prep-dto-arg hashmap-remove)
     dict-find-update-id hashmap-find-update*
     dict-size-id (prep-dto-arg hashmap-size)
     dict-count-id (prep-dto-arg hashmap-count)
     dict-keys-id (prep-dto-arg hashmap-keys)
     dict-values-id (prep-dto-arg hashmap-values)
     dict-entries-id (prep-dto-arg hashmap-entries)
     dict-fold-id (prep-dto-arg hashmap-fold)
     dict-map->list-id (prep-dto-arg hashmap-map->list)
     dict->alist-id (prep-dto-arg hashmap->alist)
     dict-comparator-id (prep-dto-arg hashmap-key-comparator))))
>-0/+35 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@34 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-07-05Added raw1394_reset_bus() call.Gravatar aeb 4-0/+23 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@33 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-22- Set library version info in configure.in, use in src/Makefile.am.Gravatar aeb 4-2/+16 - Enable compiler warnings. git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@32 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-15Update libtool version number.Gravatar aeb 2-2/+2 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@31 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-14Added copyright headers.Gravatar aeb 6-0/+54 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@30 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-11Added explicit AC_PROG_INSTALL call.Gravatar aeb 1-0/+1 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@29 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-09Fix size of error field.Gravatar aeb 1-2/+2 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@28 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-06-02Modified support for 32/64 bit environments, control struct fields have ↵Gravatar aeb 7-43/+28 fixed size now. git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@27 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-05-28Added support for environments with 64 bit kernel and 32 bit userland.Gravatar aeb 8-7/+45 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@26 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-04-27Fixed missing setting of ext code in raw1394_start_lock()Gravatar aeb 1-0/+1 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@25 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-04-15Fixed lock transaction to actually return response value.Gravatar aeb 3-5/+11 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@24 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-04-12Add userdata functions as news.Gravatar aeb 1-0/+4 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@23 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-04-05Add userdata functions.Gravatar aeb 3-0/+18 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@22 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-03-18Bump version number to 0.6.Gravatar aeb 3-5/+6 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@21 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-03-18Mention byte order change.Gravatar aeb 1-0/+2 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@20 53a565d1-3bb7-0310-b661-cf11e63c67ab 2000-03-18Mention SourceForge home.Gravatar aeb 1-1/+5 git-svn-id: svn://svn.linux1394.org/libraw1394/trunk@19 53a565d1-3bb7-0310-b661-cf11e63c67ab