Persistent Arrays

Hex Artifact Content
Login

Artifact bf124492937bf31d3e1e5bf1593e1c2f35aa7f0e:


0000: 23 20 2d 2a 2d 20 74 63 6c 20 2d 2a 2d 0a 23 23  # -*- tcl -*-.##
0010: 20 28 63 29 20 32 30 31 33 20 41 6e 64 72 65 61   (c) 2013 Andrea
0020: 73 20 4b 75 70 72 69 65 73 0a 23 20 23 20 23 23  s Kupries.# # ##
0030: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
0040: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
0050: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23  # ##############
0060: 23 23 23 23 23 23 23 0a 23 23 20 49 6e 2d 6d 65  #######.## In-me
0070: 6d 6f 72 79 20 70 68 61 73 68 3a 3a 6d 75 6c 74  mory phash::mult
0080: 69 74 69 6d 65 20 73 74 6f 72 61 67 65 2e 0a 0a  itime storage...
0090: 23 20 40 40 20 4d 65 74 61 20 42 65 67 69 6e 0a  # @@ Meta Begin.
00a0: 23 20 50 61 63 6b 61 67 65 20 70 68 61 73 68 3a  # Package phash:
00b0: 3a 6d 75 6c 74 69 74 69 6d 65 3a 3a 6d 65 6d 6f  :multitime::memo
00c0: 72 79 20 30 0a 23 20 4d 65 74 61 20 61 75 74 68  ry 0.# Meta auth
00d0: 6f 72 20 20 20 20 20 20 3f 0a 23 20 4d 65 74 61  or      ?.# Meta
00e0: 20 63 61 74 65 67 6f 72 79 20 20 20 20 3f 0a 23   category    ?.#
00f0: 20 4d 65 74 61 20 64 65 73 63 72 69 70 74 69 6f   Meta descriptio
0100: 6e 20 3f 0a 23 20 4d 65 74 61 20 6c 6f 63 61 74  n ?.# Meta locat
0110: 69 6f 6e 20 20 20 20 68 74 74 70 3a 2f 63 6f 72  ion    http:/cor
0120: 65 2e 74 63 6c 2e 74 6b 2f 61 6b 75 70 72 69 65  e.tcl.tk/akuprie
0130: 73 2f 61 72 72 61 79 0a 23 20 4d 65 74 61 20 70  s/array.# Meta p
0140: 6c 61 74 66 6f 72 6d 20 20 20 20 74 63 6c 0a 23  latform    tcl.#
0150: 20 4d 65 74 61 20 72 65 71 75 69 72 65 20 20 20   Meta require   
0160: 20 20 3f 0a 23 20 4d 65 74 61 20 73 75 62 6a 65    ?.# Meta subje
0170: 63 74 20 20 20 20 20 3f 0a 23 20 4d 65 74 61 20  ct     ?.# Meta 
0180: 73 75 6d 6d 61 72 79 20 20 20 20 20 3f 0a 23 20  summary     ?.# 
0190: 40 40 20 4d 65 74 61 20 45 6e 64 0a 0a 23 20 23  @@ Meta End..# #
01a0: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
01b0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
01c0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
01d0: 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 52 65  ##########.## Re
01e0: 71 75 69 73 69 74 65 73 0a 0a 70 61 63 6b 61 67  quisites..packag
01f0: 65 20 72 65 71 75 69 72 65 20 54 63 6c 20 38 2e  e require Tcl 8.
0200: 35 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72  5.package requir
0210: 65 20 54 63 6c 4f 4f 0a 70 61 63 6b 61 67 65 20  e TclOO.package 
0220: 72 65 71 75 69 72 65 20 70 68 61 73 68 3a 3a 6d  require phash::m
0230: 75 6c 74 69 74 69 6d 65 0a 0a 23 20 23 20 23 23  ultitime..# # ##
0240: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
0250: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
0260: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23  # ##############
0270: 23 23 23 23 23 23 23 0a 23 23 20 49 6d 70 6c 65  #######.## Imple
0280: 6d 65 6e 74 61 74 69 6f 6e 0a 0a 6f 6f 3a 3a 63  mentation..oo::c
0290: 6c 61 73 73 20 63 72 65 61 74 65 20 70 68 61 73  lass create phas
02a0: 68 3a 3a 6d 75 6c 74 69 74 69 6d 65 3a 3a 6d 65  h::multitime::me
02b0: 6d 6f 72 79 20 7b 0a 20 20 20 20 73 75 70 65 72  mory {.    super
02c0: 63 6c 61 73 73 20 70 68 61 73 68 3a 3a 6d 75 6c  class phash::mul
02d0: 74 69 74 69 6d 65 0a 0a 20 20 20 20 23 20 23 20  titime..    # # 
02e0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
02f0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
0300: 23 23 23 0a 20 20 20 20 23 23 20 53 74 61 74 65  ###.    ## State
0310: 0a 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
0320: 79 6d 61 70 20 6d 79 74 69 6d 65 0a 20 20 20 20  ymap mytime.    
0330: 23 20 6d 79 6d 61 70 3a 20 20 64 69 63 74 20 28  # mymap:  dict (
0340: 64 6f 63 20 2d 2d 3e 20 64 69 63 74 20 28 6b 65  doc --> dict (ke
0350: 79 20 2d 2d 3e 20 76 61 6c 75 65 29 29 0a 20 20  y --> value)).  
0360: 20 20 23 20 6d 79 74 69 6d 65 3a 20 64 69 63 74    # mytime: dict
0370: 20 28 64 6f 63 20 2d 2d 3e 20 64 69 63 74 20 28   (doc --> dict (
0380: 6b 65 79 20 2d 2d 3e 20 6d 74 69 6d 65 29 29 0a  key --> mtime)).
0390: 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20  .    # # ## ### 
03a0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
03b0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20  ############.   
03c0: 20 23 23 20 4c 69 66 65 63 79 63 6c 65 2e 0a 0a   ## Lifecycle...
03d0: 20 20 20 20 63 6f 6e 73 74 72 75 63 74 6f 72 20      constructor 
03e0: 7b 7d 20 7b 20 6d 79 20 63 6c 65 61 72 20 7d 0a  {} { my clear }.
03f0: 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20  .    # # ## ### 
0400: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
0410: 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20  ############.   
0420: 20 23 23 20 41 50 49 2e 20 49 6d 70 6c 65 6d 65   ## API. Impleme
0430: 6e 74 61 74 69 6f 6e 20 6f 66 20 69 6e 68 65 72  ntation of inher
0440: 69 74 65 64 20 76 69 72 74 75 61 6c 20 6d 65 74  ited virtual met
0450: 68 6f 64 73 2e 0a 20 20 20 20 23 23 20 20 20 20  hods..    ##    
0460: 20 20 41 63 63 65 73 73 20 74 6f 20 69 6e 64 69    Access to indi
0470: 76 69 64 75 61 6c 20 64 6f 63 75 6d 65 6e 74 73  vidual documents
0480: 2e 0a 0a 20 20 20 20 23 20 73 69 7a 65 3a 20 28  ...    # size: (
0490: 29 20 2d 2d 3e 20 69 6e 74 65 67 65 72 0a 20 20  ) --> integer.  
04a0: 20 20 6d 65 74 68 6f 64 20 5f 73 69 7a 65 20 7b    method _size {
04b0: 64 6f 63 7d 20 7b 0a 09 69 66 20 7b 21 5b 64 69  doc} {..if {![di
04c0: 63 74 20 65 78 69 73 74 73 20 24 6d 79 6d 61 70  ct exists $mymap
04d0: 20 24 64 6f 63 5d 7d 20 7b 72 65 74 75 72 6e 20   $doc]} {return 
04e0: 30 7d 0a 09 64 69 63 74 20 73 69 7a 65 20 5b 64  0}..dict size [d
04f0: 69 63 74 20 67 65 74 20 24 6d 79 6d 61 70 20 24  ict get $mymap $
0500: 64 6f 63 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  doc].    }..    
0510: 23 20 6e 61 6d 65 73 3a 20 3f 70 61 74 74 65 72  # names: ?patter
0520: 6e 3f 20 2d 2d 3e 20 6c 69 73 74 28 73 74 72 69  n? --> list(stri
0530: 6e 67 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 5f  ng).    method _
0540: 6e 61 6d 65 73 20 7b 64 6f 63 20 7b 70 61 74 74  names {doc {patt
0550: 65 72 6e 20 2a 7d 7d 20 7b 0a 09 69 66 20 7b 21  ern *}} {..if {!
0560: 5b 64 69 63 74 20 65 78 69 73 74 73 20 24 6d 79  [dict exists $my
0570: 6d 61 70 20 24 64 6f 63 5d 7d 20 7b 72 65 74 75  map $doc]} {retu
0580: 72 6e 20 7b 7d 7d 0a 09 64 69 63 74 20 6b 65 79  rn {}}..dict key
0590: 73 20 5b 64 69 63 74 20 67 65 74 20 24 6d 79 6d  s [dict get $mym
05a0: 61 70 20 24 64 6f 63 5d 20 24 70 61 74 74 65 72  ap $doc] $patter
05b0: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 65  n.    }..    # e
05c0: 78 69 73 74 73 3a 20 6b 65 79 20 2d 2d 3e 20 62  xists: key --> b
05d0: 6f 6f 6c 65 61 6e 0a 20 20 20 20 6d 65 74 68 6f  oolean.    metho
05e0: 64 20 5f 65 78 69 73 74 73 20 7b 64 6f 63 20 6b  d _exists {doc k
05f0: 65 79 7d 20 7b 0a 09 69 66 20 7b 21 5b 64 69 63  ey} {..if {![dic
0600: 74 20 65 78 69 73 74 73 20 24 6d 79 6d 61 70 20  t exists $mymap 
0610: 24 64 6f 63 5d 7d 20 7b 72 65 74 75 72 6e 20 30  $doc]} {return 0
0620: 7d 0a 09 64 69 63 74 20 65 78 69 73 74 73 20 24  }..dict exists $
0630: 6d 79 6d 61 70 20 24 64 6f 63 20 24 6b 65 79 0a  mymap $doc $key.
0640: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 67 65 74      }..    # get
0650: 3a 20 3f 70 61 74 74 65 72 6e 3f 20 2d 2d 3e 20  : ?pattern? --> 
0660: 64 69 63 74 20 28 6b 65 79 20 2d 2d 3e 20 76 61  dict (key --> va
0670: 6c 75 65 29 0a 20 20 20 20 6d 65 74 68 6f 64 20  lue).    method 
0680: 5f 67 65 74 20 7b 64 6f 63 20 7b 70 61 74 74 65  _get {doc {patte
0690: 72 6e 20 2a 7d 7d 20 7b 0a 09 69 66 20 7b 21 5b  rn *}} {..if {![
06a0: 64 69 63 74 20 65 78 69 73 74 73 20 24 6d 79 6d  dict exists $mym
06b0: 61 70 20 24 64 6f 63 5d 7d 20 7b 72 65 74 75 72  ap $doc]} {retur
06c0: 6e 20 7b 7d 7d 0a 09 64 69 63 74 20 66 69 6c 74  n {}}..dict filt
06d0: 65 72 20 5b 64 69 63 74 20 67 65 74 20 24 6d 79  er [dict get $my
06e0: 6d 61 70 20 24 64 6f 63 5d 20 6b 65 79 20 24 70  map $doc] key $p
06f0: 61 74 74 65 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  attern.    }..  
0700: 20 20 23 20 76 61 6c 75 65 3a 20 3f 70 61 74 74    # value: ?patt
0710: 65 72 6e 3f 20 2d 2d 3e 20 64 69 63 74 20 28 6b  ern? --> dict (k
0720: 65 79 20 2d 2d 3e 20 76 61 6c 75 65 29 0a 20 20  ey --> value).  
0730: 20 20 6d 65 74 68 6f 64 20 5f 76 61 6c 75 65 20    method _value 
0740: 7b 64 6f 63 20 7b 70 61 74 74 65 72 6e 20 2a 7d  {doc {pattern *}
0750: 7d 20 7b 0a 09 69 66 20 7b 21 5b 64 69 63 74 20  } {..if {![dict 
0760: 65 78 69 73 74 73 20 24 6d 79 6d 61 70 20 24 64  exists $mymap $d
0770: 6f 63 5d 7d 20 7b 72 65 74 75 72 6e 20 7b 7d 7d  oc]} {return {}}
0780: 0a 09 64 69 63 74 20 66 69 6c 74 65 72 20 5b 64  ..dict filter [d
0790: 69 63 74 20 67 65 74 20 24 6d 79 6d 61 70 20 24  ict get $mymap $
07a0: 64 6f 63 5d 20 76 61 6c 75 65 20 24 70 61 74 74  doc] value $patt
07b0: 65 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  ern.    }..    #
07c0: 20 67 65 74 76 3a 20 6b 65 79 20 2d 2d 3e 20 76   getv: key --> v
07d0: 61 6c 75 65 0a 20 20 20 20 6d 65 74 68 6f 64 20  alue.    method 
07e0: 5f 67 65 74 76 20 7b 64 6f 63 20 6b 65 79 7d 20  _getv {doc key} 
07f0: 7b 0a 09 6d 79 20 56 61 6c 69 64 61 74 65 20 24  {..my Validate $
0800: 64 6f 63 20 24 6b 65 79 0a 09 64 69 63 74 20 67  doc $key..dict g
0810: 65 74 20 24 6d 79 6d 61 70 20 24 64 6f 63 20 24  et $mymap $doc $
0820: 6b 65 79 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  key.    }..    #
0830: 20 73 65 74 3a 20 64 69 63 74 20 28 6b 65 79 20   set: dict (key 
0840: 2d 2d 3e 20 76 61 6c 75 65 29 20 2d 2d 3e 20 28  --> value) --> (
0850: 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 5f 73 65  ).    method _se
0860: 74 20 7b 64 6f 63 20 64 69 63 74 7d 20 7b 0a 09  t {doc dict} {..
0870: 73 65 74 20 6e 6f 77 20 5b 63 6c 6f 63 6b 20 73  set now [clock s
0880: 65 63 6f 6e 64 73 5d 0a 09 69 66 20 7b 21 5b 64  econds]..if {![d
0890: 69 63 74 20 65 78 69 73 74 73 20 24 6d 79 6d 61  ict exists $myma
08a0: 70 20 24 64 6f 63 5d 7d 20 7b 0a 09 20 20 20 20  p $doc]} {..    
08b0: 64 69 63 74 20 73 65 74 20 6d 79 6d 61 70 20 24  dict set mymap $
08c0: 64 6f 63 20 24 64 69 63 74 0a 09 7d 20 65 6c 73  doc $dict..} els
08d0: 65 20 7b 0a 09 20 20 20 20 73 65 74 20 6d 79 6d  e {..    set mym
08e0: 61 70 20 5b 64 69 63 74 20 72 65 70 6c 61 63 65  ap [dict replace
08f0: 20 24 6d 79 6d 61 70 20 24 64 6f 63 20 5c 0a 09   $mymap $doc \..
0900: 09 09 20 20 20 5b 64 69 63 74 20 6d 65 72 67 65  ..   [dict merge
0910: 20 5c 0a 09 09 09 09 5b 64 69 63 74 20 67 65 74   \.....[dict get
0920: 20 24 6d 79 6d 61 70 20 24 64 6f 63 5d 20 5c 0a   $mymap $doc] \.
0930: 09 09 09 09 24 64 69 63 74 5d 5d 0a 09 7d 0a 09  ....$dict]]..}..
0940: 64 69 63 74 20 66 6f 72 20 7b 6b 20 5f 7d 20 24  dict for {k _} $
0950: 64 69 63 74 20 7b 0a 09 20 20 20 20 64 69 63 74  dict {..    dict
0960: 20 73 65 74 20 6d 79 74 69 6d 65 20 24 64 6f 63   set mytime $doc
0970: 20 24 6b 20 24 6e 6f 77 0a 09 7d 0a 09 72 65 74   $k $now..}..ret
0980: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  urn.    }..    #
0990: 20 73 65 74 76 3a 20 28 6b 65 79 20 76 61 6c 75   setv: (key valu
09a0: 65 20 3f 74 69 6d 65 3f 29 20 2d 2d 3e 20 76 61  e ?time?) --> va
09b0: 6c 75 65 0a 20 20 20 20 6d 65 74 68 6f 64 20 5f  lue.    method _
09c0: 73 65 74 76 20 7b 64 6f 63 20 6b 65 79 20 76 61  setv {doc key va
09d0: 6c 75 65 20 7b 74 69 6d 65 20 7b 7d 7d 7d 20 7b  lue {time {}}} {
09e0: 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b  ..if {[llength [
09f0: 69 6e 66 6f 20 6c 65 76 65 6c 20 30 5d 5d 20 3c  info level 0]] <
0a00: 20 36 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 74   6} {..    set t
0a10: 69 6d 65 20 5b 63 6c 6f 63 6b 20 73 65 63 6f 6e  ime [clock secon
0a20: 64 73 5d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ds]..} else {.. 
0a30: 20 20 20 6d 79 20 56 61 6c 69 64 61 74 65 54 69     my ValidateTi
0a40: 6d 65 20 24 74 69 6d 65 0a 09 7d 0a 09 64 69 63  me $time..}..dic
0a50: 74 20 73 65 74 20 6d 79 6d 61 70 20 20 24 64 6f  t set mymap  $do
0a60: 63 20 24 6b 65 79 20 24 76 61 6c 75 65 0a 09 64  c $key $value..d
0a70: 69 63 74 20 73 65 74 20 6d 79 74 69 6d 65 20 24  ict set mytime $
0a80: 64 6f 63 20 24 6b 65 79 20 24 74 69 6d 65 0a 09  doc $key $time..
0a90: 72 65 74 75 72 6e 20 24 76 61 6c 75 65 0a 20 20  return $value.  
0aa0: 20 20 7d 0a 0a 20 20 20 20 23 20 75 6e 73 65 74    }..    # unset
0ab0: 3a 20 3f 70 61 74 74 65 72 6e 3f 20 2d 2d 3e 20  : ?pattern? --> 
0ac0: 28 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 5f 75  ().    method _u
0ad0: 6e 73 65 74 20 7b 64 6f 63 20 7b 70 61 74 74 65  nset {doc {patte
0ae0: 72 6e 20 2a 7d 7d 20 7b 0a 09 69 66 20 7b 21 5b  rn *}} {..if {![
0af0: 64 69 63 74 20 65 78 69 73 74 73 20 24 6d 79 6d  dict exists $mym
0b00: 61 70 20 24 64 6f 63 5d 7d 20 72 65 74 75 72 6e  ap $doc]} return
0b10: 0a 09 69 66 20 7b 24 70 61 74 74 65 72 6e 20 65  ..if {$pattern e
0b20: 71 20 22 2a 22 7d 20 7b 0a 09 20 20 20 20 64 69  q "*"} {..    di
0b30: 63 74 20 75 6e 73 65 74 20 6d 79 6d 61 70 20 20  ct unset mymap  
0b40: 24 64 6f 63 0a 09 20 20 20 20 64 69 63 74 20 75  $doc..    dict u
0b50: 6e 73 65 74 20 6d 79 74 69 6d 65 20 24 64 6f 63  nset mytime $doc
0b60: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
0b70: 66 6f 72 65 61 63 68 20 6b 20 5b 64 69 63 74 20  foreach k [dict 
0b80: 6b 65 79 73 20 5b 64 69 63 74 20 67 65 74 20 24  keys [dict get $
0b90: 6d 79 6d 61 70 20 24 64 6f 63 5d 20 24 70 61 74  mymap $doc] $pat
0ba0: 74 65 72 6e 5d 20 7b 0a 09 09 64 69 63 74 20 75  tern] {...dict u
0bb0: 6e 73 65 74 20 6d 79 6d 61 70 20 20 24 64 6f 63  nset mymap  $doc
0bc0: 20 24 6b 0a 09 09 64 69 63 74 20 75 6e 73 65 74   $k...dict unset
0bd0: 20 6d 79 74 69 6d 65 20 24 64 6f 63 20 24 6b 0a   mytime $doc $k.
0be0: 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72  .    }..}..retur
0bf0: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 75  n.    }..    # u
0c00: 6e 73 65 74 76 3a 20 6b 65 79 20 2d 2d 3e 20 28  nsetv: key --> (
0c10: 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 5f 75 6e  ).    method _un
0c20: 73 65 74 76 20 7b 64 6f 63 20 6b 65 79 7d 20 7b  setv {doc key} {
0c30: 0a 09 6d 79 20 56 61 6c 69 64 61 74 65 20 24 64  ..my Validate $d
0c40: 6f 63 20 24 6b 65 79 0a 09 64 69 63 74 20 75 6e  oc $key..dict un
0c50: 73 65 74 20 6d 79 6d 61 70 20 20 24 64 6f 63 20  set mymap  $doc 
0c60: 24 6b 65 79 0a 09 64 69 63 74 20 75 6e 73 65 74  $key..dict unset
0c70: 20 6d 79 74 69 6d 65 20 24 64 6f 63 20 24 6b 65   mytime $doc $ke
0c80: 79 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  y..return.    }.
0c90: 0a 20 20 20 20 23 20 63 6c 65 61 72 3a 20 28 29  .    # clear: ()
0ca0: 20 2d 2d 3e 20 28 29 0a 20 20 20 20 6d 65 74 68   --> ().    meth
0cb0: 6f 64 20 5f 63 6c 65 61 72 20 7b 64 6f 63 7d 20  od _clear {doc} 
0cc0: 7b 0a 09 69 66 20 7b 21 5b 64 69 63 74 20 65 78  {..if {![dict ex
0cd0: 69 73 74 73 20 24 6d 79 6d 61 70 20 24 64 6f 63  ists $mymap $doc
0ce0: 5d 7d 20 72 65 74 75 72 6e 0a 09 64 69 63 74 20  ]} return..dict 
0cf0: 75 6e 73 65 74 20 6d 79 6d 61 70 20 24 64 6f 63  unset mymap $doc
0d00: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
0d10: 20 20 20 20 23 20 67 65 74 2d 74 69 6d 65 3a 20      # get-time: 
0d20: 3f 70 61 74 74 65 72 6e 3f 20 2d 2d 3e 20 64 69  ?pattern? --> di
0d30: 63 74 20 28 6b 65 79 20 2d 2d 3e 20 6d 74 69 6d  ct (key --> mtim
0d40: 65 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 5f 67  e).    method _g
0d50: 65 74 74 69 6d 65 20 7b 64 6f 63 20 7b 70 61 74  ettime {doc {pat
0d60: 74 65 72 6e 20 2a 7d 7d 20 7b 0a 09 69 66 20 7b  tern *}} {..if {
0d70: 21 5b 64 69 63 74 20 65 78 69 73 74 73 20 24 6d  ![dict exists $m
0d80: 79 74 69 6d 65 20 24 64 6f 63 5d 7d 20 7b 72 65  ytime $doc]} {re
0d90: 74 75 72 6e 20 7b 7d 7d 0a 09 64 69 63 74 20 66  turn {}}..dict f
0da0: 69 6c 74 65 72 20 5b 64 69 63 74 20 67 65 74 20  ilter [dict get 
0db0: 24 6d 79 74 69 6d 65 20 24 64 6f 63 5d 20 6b 65  $mytime $doc] ke
0dc0: 79 20 24 70 61 74 74 65 72 6e 0a 20 20 20 20 7d  y $pattern.    }
0dd0: 0a 0a 20 20 20 20 23 20 67 65 74 2d 74 69 6d 65  ..    # get-time
0de0: 76 3a 20 6b 65 79 20 2d 2d 3e 20 6d 74 69 6d 65  v: key --> mtime
0df0: 0a 20 20 20 20 6d 65 74 68 6f 64 20 5f 67 65 74  .    method _get
0e00: 74 69 6d 65 76 20 7b 64 6f 63 20 6b 65 79 7d 20  timev {doc key} 
0e10: 7b 0a 09 6d 79 20 56 61 6c 69 64 61 74 65 20 24  {..my Validate $
0e20: 64 6f 63 20 24 6b 65 79 0a 09 64 69 63 74 20 67  doc $key..dict g
0e30: 65 74 20 24 6d 79 74 69 6d 65 20 24 64 6f 63 20  et $mytime $doc 
0e40: 24 6b 65 79 0a 20 20 20 20 7d 0a 0a 20 20 20 20  $key.    }..    
0e50: 23 20 73 65 74 2d 74 69 6d 65 76 3a 20 28 6b 65  # set-timev: (ke
0e60: 79 2c 20 74 69 6d 65 29 20 2d 2d 3e 20 74 69 6d  y, time) --> tim
0e70: 65 0a 20 20 20 20 6d 65 74 68 6f 64 20 5f 73 65  e.    method _se
0e80: 74 74 69 6d 65 76 20 7b 64 6f 63 20 6b 65 79 20  ttimev {doc key 
0e90: 74 69 6d 65 7d 20 7b 0a 09 64 69 63 74 20 73 65  time} {..dict se
0ea0: 74 20 6d 79 74 69 6d 65 20 24 64 6f 63 20 24 6b  t mytime $doc $k
0eb0: 65 79 20 24 74 69 6d 65 0a 09 72 65 74 75 72 6e  ey $time..return
0ec0: 20 24 74 69 6d 65 0a 20 20 20 20 7d 0a 0a 20 20   $time.    }..  
0ed0: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23    # # ## ### ###
0ee0: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23  ## ######## ####
0ef0: 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23  #########.    ##
0f00: 20 41 50 49 2e 20 49 6d 70 6c 65 6d 65 6e 74 61   API. Implementa
0f10: 74 69 6f 6e 20 6f 66 20 69 6e 68 65 72 69 74 65  tion of inherite
0f20: 64 20 76 69 72 74 75 61 6c 20 6d 65 74 68 6f 64  d virtual method
0f30: 73 2e 0a 20 20 20 20 23 0a 20 20 20 20 23 23 20  s..    #.    ## 
0f40: 47 6c 6f 62 61 6c 20 41 50 49 20 66 6f 72 20 6f  Global API for o
0f50: 76 65 72 61 6c 6c 20 28 64 6f 63 75 6d 65 6e 74  verall (document
0f60: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 61 63 63   independent acc
0f70: 65 73 73 29 2e 0a 0a 20 20 20 20 23 20 73 69 7a  ess)...    # siz
0f80: 65 3a 20 28 29 20 2d 2d 3e 20 69 6e 74 65 67 65  e: () --> intege
0f90: 72 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 69 7a  r.    method siz
0fa0: 65 20 7b 7d 20 7b 20 64 69 63 74 20 73 69 7a 65  e {} { dict size
0fb0: 20 24 6d 79 6d 61 70 20 7d 0a 0a 20 20 20 20 23   $mymap }..    #
0fc0: 20 6e 61 6d 65 73 3a 20 3f 70 61 74 74 65 72 6e   names: ?pattern
0fd0: 3f 20 2d 2d 3e 20 6c 69 73 74 28 73 74 72 69 6e  ? --> list(strin
0fe0: 67 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 6e 61  g).    method na
0ff0: 6d 65 73 20 7b 7b 70 61 74 74 65 72 6e 20 2a 7d  mes {{pattern *}
1000: 7d 20 7b 20 64 69 63 74 20 6b 65 79 73 20 24 6d  } { dict keys $m
1010: 79 6d 61 70 20 24 70 61 74 74 65 72 6e 20 7d 0a  ymap $pattern }.
1020: 0a 20 20 20 20 23 20 6b 65 79 73 3a 20 3f 70 61  .    # keys: ?pa
1030: 74 74 65 72 6e 3f 20 2d 2d 3e 20 6c 69 73 74 28  ttern? --> list(
1040: 73 74 72 69 6e 67 29 0a 20 20 20 20 6d 65 74 68  string).    meth
1050: 6f 64 20 6b 65 79 73 20 7b 7b 70 61 74 74 65 72  od keys {{patter
1060: 6e 20 2a 7d 7d 20 7b 0a 09 73 65 74 20 72 20 7b  n *}} {..set r {
1070: 7d 0a 09 64 69 63 74 20 66 6f 72 20 7b 64 6f 63  }..dict for {doc
1080: 20 70 61 72 74 69 74 69 6f 6e 7d 20 24 6d 79 6d   partition} $mym
1090: 61 70 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e  ap {..    lappen
10a0: 64 20 72 20 7b 2a 7d 5b 64 69 63 74 20 6b 65 79  d r {*}[dict key
10b0: 73 20 24 70 61 72 74 69 74 69 6f 6e 20 24 70 61  s $partition $pa
10c0: 74 74 65 72 6e 5d 0a 09 20 20 20 20 73 65 74 20  ttern]..    set 
10d0: 72 20 5b 6c 73 6f 72 74 20 2d 75 6e 69 71 75 65  r [lsort -unique
10e0: 20 24 72 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 20   $r]..}..return 
10f0: 24 72 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  $r.    }..    # 
1100: 67 65 74 3a 20 3f 70 61 74 74 65 72 6e 3f 20 2d  get: ?pattern? -
1110: 2d 3e 20 28 64 69 63 74 20 28 6b 65 79 20 2d 2d  -> (dict (key --
1120: 3e 20 28 64 6f 63 20 2d 2d 3e 20 76 61 6c 75 65  > (doc --> value
1130: 29 29 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 67  ))).    method g
1140: 65 74 20 7b 7b 70 61 74 74 65 72 6e 20 2a 7d 7d  et {{pattern *}}
1150: 20 7b 0a 09 73 65 74 20 72 20 7b 7d 0a 09 64 69   {..set r {}..di
1160: 63 74 20 66 6f 72 20 7b 64 6f 63 20 70 61 72 74  ct for {doc part
1170: 69 74 69 6f 6e 7d 20 24 6d 79 6d 61 70 20 7b 0a  ition} $mymap {.
1180: 09 20 20 20 20 66 6f 72 65 61 63 68 20 6b 20 5b  .    foreach k [
1190: 64 69 63 74 20 6b 65 79 73 20 24 70 61 72 74 69  dict keys $parti
11a0: 74 69 6f 6e 20 24 70 61 74 74 65 72 6e 5d 20 7b  tion $pattern] {
11b0: 0a 09 09 64 69 63 74 20 73 65 74 20 72 20 24 6b  ...dict set r $k
11c0: 20 24 64 6f 63 20 5b 64 69 63 74 20 67 65 74 20   $doc [dict get 
11d0: 24 70 61 72 74 69 74 69 6f 6e 20 24 6b 5d 0a 09  $partition $k]..
11e0: 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e      }..}..return
11f0: 20 24 72 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23   $r.    }..    #
1200: 20 67 65 74 76 3a 20 6b 65 79 20 2d 2d 3e 20 28   getv: key --> (
1210: 64 69 63 74 20 28 64 6f 63 20 2d 2d 3e 20 76 61  dict (doc --> va
1220: 6c 75 65 29 29 0a 20 20 20 20 6d 65 74 68 6f 64  lue)).    method
1230: 20 67 65 74 76 20 7b 6b 65 79 7d 20 7b 0a 09 73   getv {key} {..s
1240: 65 74 20 72 20 7b 7d 0a 09 64 69 63 74 20 66 6f  et r {}..dict fo
1250: 72 20 7b 64 6f 63 20 70 61 72 74 69 74 69 6f 6e  r {doc partition
1260: 7d 20 24 6d 79 6d 61 70 20 7b 0a 09 20 20 20 20  } $mymap {..    
1270: 69 66 20 7b 21 5b 64 69 63 74 20 65 78 69 73 74  if {![dict exist
1280: 73 20 24 70 61 72 74 69 74 69 6f 6e 20 24 6b 65  s $partition $ke
1290: 79 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 20 20  y]} continue..  
12a0: 20 20 64 69 63 74 20 73 65 74 20 72 20 24 64 6f    dict set r $do
12b0: 63 20 5b 64 69 63 74 20 67 65 74 20 24 70 61 72  c [dict get $par
12c0: 74 69 74 69 6f 6e 20 24 6b 65 79 5d 0a 09 7d 0a  tition $key]..}.
12d0: 09 72 65 74 75 72 6e 20 24 72 0a 20 20 20 20 7d  .return $r.    }
12e0: 0a 0a 20 20 20 20 23 20 75 6e 73 65 74 3a 20 3f  ..    # unset: ?
12f0: 70 61 74 74 65 72 6e 3f 20 2d 2d 3e 20 28 29 0a  pattern? --> ().
1300: 20 20 20 20 6d 65 74 68 6f 64 20 75 6e 73 65 74      method unset
1310: 20 7b 7b 70 61 74 74 65 72 6e 20 2a 7d 7d 20 7b   {{pattern *}} {
1320: 0a 09 64 69 63 74 20 66 6f 72 20 7b 64 6f 63 20  ..dict for {doc 
1330: 70 61 72 74 69 74 69 6f 6e 7d 20 24 6d 79 6d 61  partition} $myma
1340: 70 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68  p {..    foreach
1350: 20 6b 20 5b 64 69 63 74 20 6b 65 79 73 20 24 70   k [dict keys $p
1360: 61 72 74 69 74 69 6f 6e 20 24 70 61 74 74 65 72  artition $patter
1370: 6e 5d 20 7b 0a 09 09 64 69 63 74 20 75 6e 73 65  n] {...dict unse
1380: 74 20 70 61 72 74 69 74 69 6f 6e 20 24 6b 0a 09  t partition $k..
1390: 20 20 20 20 7d 0a 09 20 20 20 20 64 69 63 74 20      }..    dict 
13a0: 73 65 74 20 6d 79 6d 61 70 20 24 64 6f 63 20 24  set mymap $doc $
13b0: 70 61 72 74 69 74 69 6f 6e 0a 09 7d 0a 09 64 69  partition..}..di
13c0: 63 74 20 66 6f 72 20 7b 64 6f 63 20 70 61 72 74  ct for {doc part
13d0: 69 74 69 6f 6e 7d 20 24 6d 79 74 69 6d 65 20 7b  ition} $mytime {
13e0: 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 6b 20  ..    foreach k 
13f0: 5b 64 69 63 74 20 6b 65 79 73 20 24 70 61 72 74  [dict keys $part
1400: 69 74 69 6f 6e 20 24 70 61 74 74 65 72 6e 5d 20  ition $pattern] 
1410: 7b 0a 09 09 64 69 63 74 20 75 6e 73 65 74 20 70  {...dict unset p
1420: 61 72 74 69 74 69 6f 6e 20 24 6b 0a 09 20 20 20  artition $k..   
1430: 20 7d 0a 09 20 20 20 20 64 69 63 74 20 73 65 74   }..    dict set
1440: 20 6d 79 74 69 6d 65 20 24 64 6f 63 20 24 70 61   mytime $doc $pa
1450: 72 74 69 74 69 6f 6e 0a 09 7d 0a 09 72 65 74 75  rtition..}..retu
1460: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
1470: 75 6e 73 65 74 76 3a 20 6b 65 79 20 2d 2d 3e 20  unsetv: key --> 
1480: 28 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 75 6e  ().    method un
1490: 73 65 74 76 20 7b 6b 65 79 7d 20 7b 0a 09 64 69  setv {key} {..di
14a0: 63 74 20 66 6f 72 20 7b 64 6f 63 20 70 61 72 74  ct for {doc part
14b0: 69 74 69 6f 6e 7d 20 24 6d 79 6d 61 70 20 7b 0a  ition} $mymap {.
14c0: 09 20 20 20 20 64 69 63 74 20 75 6e 73 65 74 20  .    dict unset 
14d0: 70 61 72 74 69 74 69 6f 6e 20 24 6b 65 79 0a 09  partition $key..
14e0: 20 20 20 20 64 69 63 74 20 73 65 74 20 6d 79 6d      dict set mym
14f0: 61 70 20 24 64 6f 63 20 24 70 61 72 74 69 74 69  ap $doc $partiti
1500: 6f 6e 0a 09 7d 0a 09 64 69 63 74 20 66 6f 72 20  on..}..dict for 
1510: 7b 64 6f 63 20 70 61 72 74 69 74 69 6f 6e 7d 20  {doc partition} 
1520: 24 6d 79 74 69 6d 65 20 7b 0a 09 20 20 20 20 64  $mytime {..    d
1530: 69 63 74 20 75 6e 73 65 74 20 70 61 72 74 69 74  ict unset partit
1540: 69 6f 6e 20 24 6b 65 79 0a 09 20 20 20 20 64 69  ion $key..    di
1550: 63 74 20 73 65 74 20 6d 79 74 69 6d 65 20 24 64  ct set mytime $d
1560: 6f 63 20 24 70 61 72 74 69 74 69 6f 6e 0a 09 7d  oc $partition..}
1570: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
1580: 20 20 20 20 23 20 63 6c 65 61 72 3a 20 28 29 20      # clear: () 
1590: 2d 2d 3e 20 28 29 0a 20 20 20 20 6d 65 74 68 6f  --> ().    metho
15a0: 64 20 63 6c 65 61 72 20 7b 7d 20 7b 0a 09 73 65  d clear {} {..se
15b0: 74 20 6d 79 6d 61 70 20 20 7b 7d 0a 09 73 65 74  t mymap  {}..set
15c0: 20 6d 79 74 69 6d 65 20 7b 7d 0a 09 72 65 74 75   mytime {}..retu
15d0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
15e0: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
15f0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
1600: 23 23 23 23 23 0a 20 20 20 20 23 23 20 49 6e 74  #####.    ## Int
1610: 65 72 6e 61 6c 20 68 65 6c 70 65 72 73 0a 0a 20  ernal helpers.. 
1620: 20 20 20 6d 65 74 68 6f 64 20 56 61 6c 69 64 61     method Valida
1630: 74 65 20 7b 64 6f 63 20 6b 65 79 7d 20 7b 0a 09  te {doc key} {..
1640: 69 66 20 7b 5b 64 69 63 74 20 65 78 69 73 74 73  if {[dict exists
1650: 20 24 6d 79 6d 61 70 20 24 64 6f 63 20 24 6b 65   $mymap $doc $ke
1660: 79 5d 7d 20 72 65 74 75 72 6e 0a 09 6d 79 20 45  y]} return..my E
1670: 72 72 6f 72 20 22 45 78 70 65 63 74 65 64 20 6b  rror "Expected k
1680: 65 79 2c 20 67 6f 74 20 5c 22 24 6b 65 79 5c 22  ey, got \"$key\"
1690: 22 20 42 41 44 20 4b 45 59 20 24 6b 65 79 0a 20  " BAD KEY $key. 
16a0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23     }..    # # ##
16b0: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
16c0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
16d0: 23 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20  #.}..# # ## ### 
16e0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
16f0: 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23  ############ ###
1700: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
1710: 23 23 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 69  ##.package provi
1720: 64 65 20 70 68 61 73 68 3a 3a 6d 75 6c 74 69 74  de phash::multit
1730: 69 6d 65 3a 3a 6d 65 6d 6f 72 79 20 30 0a 72 65  ime::memory 0.re
1740: 74 75 72 6e 0a                                   turn.