Class new title: Dictionary subclassof: HashSet fields: 'values' declare: ''  t1 [values  (self findorerror: t1)]  t1 _ t2 [values  self findorerror: t1 _ t2] asInvertedVector | t1 t2 t3 [t1 _ (Vector new: objects length) asStream. for t2 to: objects length do [objects  t2  nil  [] t3 _ Vector new: 2. t3  1 _ values  t2. t3  2 _ objects  t2. t1 next_ t3]. t1 contents] clean | t1 [for t1 from: self do [(self  t1) refct = 1  [self delete: t1]]] copyfrom: t1 [self objects_ t1 objects copy. values _ t1 values copy] delete: t1 [t1 is: Vector  [super delete: t1] values  self findorerror: t1 _ nil. super delete: t1] growto: t1 | t2 t3 [t3 _ self class new init: t1. for t2 from: self do [t3 insert: t2 with: self  t2]. self copyfrom: t3] init: t1 [values _ Vector new: t1. super init: t1] insert: t1 with: t2 [self insert: t1. values  self findorerror: t1 _ t2] insertall: t1 [self insertall: t1 with: (Vector new: t1 length)] insertall: t1 with: t2 | t3 [for t3 to: t1 length do [self insert: t1  t3 with: t2  t3]] invert [self invertto: (Dictionary new init: objects length)] invert: t1 | t2 [for t2 to: values length do [values  t2 = t1  [objects  t2]]. false] invertto: t1 | t2 [for t2 to: objects length do [objects  t2  nil  [] t1 insert: values  t2 with: objects  t2]. t1] lookup: t1 | t2 [t2 _ self find: t1. t2  [values  t2] false] rehash | t1 t2 [t2 _ Dictionary new init: self size. for t1 to: objects length do [objects  t1  nil  [] t2 insert: objects  t1 with: values  t1]. self copyfrom: t2] swap: t1 with: t2 [values swap: t1 with: t2. super swap: t1 with: t2] tally: t1 | t2 [t2 _ self find: t1. t2  [values  t2 _ values  t2 + 1] self insert: t1 with: 1. 1] values [values] with: t1 values: t2 | t3 [for t3 to: t1 length do [self insert: t1  t3 with: t2  t3]]