Ingo Blechschmidt <iblech <at> web.de> writes: 
> > then it has a better chance of working, presuming someone has the 
> > gumption to write .pick on hashes, which doesn't look entirely trivial 
> > to do right. 
>  
> <thinking out loud>I'm sure I overlooked something, but the following 
> seems to be correct and is not *that* difficult :): 
>   class Hash; 
>   ...; 
>   method pick() is rw { 
>     # First pick a random key. 
>     my $key = .keys.pick; 
>     # Then return an appropriate Proxy object: 
>     return new Proxy: 
>       FETCH => { 
>  
> Ok. While typing the C<{> here, I realized you were correct :) 
> It'd be reasonable simple if there was a .get_pair_by_key method 
> (which'd do appropriate binding and'd be C<is rw>): 
>  
>   method pick() is rw { 
>     my $key   = .keys.pick; 
>     my $pair := .get_pair_by_key($key); 
>     return $pair; 
>   } 
 
well :) 
 
  # Ignoring multi-dimensionality 
  method pairbykey($key is copy) is rw { 
    return new Proxy: 
      FETCH => -> $pair { $self{$key} }, 
      STORE => -> $pair { 
        my ($newkey, $newval) = $pair.kv; 
        $self.delete($key);               # Delete old entry 
        $self{$key = $newkey} = $newval;  # Add new entry 
      }; 
  } 
  # Correct? 
 
BTW, this would make the following work, too: 
  for %hash.pairs -> $pair is rw { $pair = ... } 
  # Implementation of Hash::pairs: 
  method pairs (Any|Junction [EMAIL PROTECTED]) { 
    my @keys = @keytests ?? .keys.grep:{ $_ ~~ any @keytests } :: .keys; 
    return .pairbykeyÂ.(@keys); 
  } 
  # Correct? 
 
The next logical step to full rw-ness would be a rw .pairs (@keytests 
removed for simplicity): 
  method pairs ($self:) is rw { 
    return new Proxy: 
      FETCH => { .pairbykeyÂ.(.keys) }, 
      STORE => -> [EMAIL PROTECTED] { 
        .delete($_) for .keys; 
        # [Is there a .clear? The obvious way, %hash = ()/ 
        # $self = {} won't work of course.] 
        $self{$_.key} = $_.value for @new; 
      }; 
  } 
  # Correct? 
 
</thinking out loud> 
 
--Ingo 
 
--  
Linux, the choice of a GNU | Mr. Cole's Axiom: The sum of the 
generation on a dual AMD   | intelligence on the planet is a constant; 
Athlon!                    | the population is growing.  

Reply via email to