On Wed, Nov 12, 2003 at 05:17:28PM +0000, Simon Cozens wrote:
> Randy W. Sims:
> > Sounds like a set/multiset/bag structure.
> 
> I thought it sounded more like a sorted array, but I'm prepared to be
> persuaded otherwise. (Primarily because I've already released the module
> to CPAN. ;)

I think the point is that T::S::A is closer to a set than an array, or more
to the point it's interace is just an expansion of a Set's interface.
Whereas it is a restriction of an array's interface - well it doesn't have to
be a restriction but as you point out in the docs, using the full array
interface doesn't make sense and for instance

push(@a, $n);
pop(@a);

doesn't leave @a unchanged and a whole load of other un-arraylike things

So if Perl's standard collection types had been objects from the start and
had been implemented as a hierarchy with consistent interfaces then you
probably would have called it Set::Ordered because it looks like a Set with
extra stuff:

Set methods
insert($elem)
delete($elem)
count
get_iterator

Sorted Set methods
# same as Set and also
deleteindex($index)

Array methods
# same as Sorted Set and also

insertindex($index, $elem)
# as you point out in the docs, this makes no sense for a T::A::S

splice
pop
etc etc

And a Sorted Set could be passed into a function expecting a genuine Set
with nothing to worry about. However you cannot pass a T::A::S into a
function expecting a genuine array because it might do something like

        $a->[0] = "defcon 5";
        ...
        launch_missiles() unless $a->[0] = "defcon 5";

All that said, it probably makes more sense to leave the name as it is but
how about implementing it as a nice object oriented ordered set and making
the Tie stuff a very thin wrapper around that? Actually you could do with

*PUSH = \&insert;
*DELETE = \&deleteindex;

sub delete
{
        # a good home for your binary search implementation
}

Thinking of it in terms of usage, this module is useful when you have some
already existing code that expects an array and wants to

- read some values from it
- push/unshift some stuff onto it
- fill it with completely new contents.

If the routine does anything besides that it will not work properly with a
T::A::S array. So I'd throw an expcetion in STORE rather than trying to do
"the right thing" because it's almost certainly not the right thing.

Any code that knows it's a sorted array can achieve the same effect with a
delete and a push and it could also use the OO interface which would be
faster than going through all the tie stuff,

F

Reply via email to