SYNOPSIS
        mixed unique_array(object *obj, string|closure fun)
        mixed unique_array(object *obj, string|closure fun, mixed skip)
        mixed unique_array(object *obj, string|closure fun, mixed extra...
                                      , mixed skip)

BESCHREIBUNG
        Gruppiert alle Objekte aus <*obj>, fuer die die Funktion <fun>
        den gleichen Wert liefert. Wenn <*obj> etwas anderes als Objekte
        enthaelt, werden diese ignoriert.
        
        Ist die Funktion mit Namen angegeben, wird sie in jedem Objekt
        in <*obj> einmal aufgerufen. Wurden <extra> Argumente
        gegeben, werden diese an die Funktion bei jedem Aufruf als
        Parameter uebergeben.

        Ist die Funktion als Closure angegeben, wird sie fuer jedes Objekt
        in <*obj> einmal aufgerufen, wobei das Objekt als erstes Argument
        uebergeben wird, gefolgt von etwaiigen <extra> Argumenten.

        Wird ein Argument <skip> angegeben (bei Verwendung von <extra>
        Argumenten muss dies geschehen), und entspricht <skip> dem
        Resultat von <separator> fuer ein Element aus <*obj>, so wird
        dieses Element nicht in das Resultat von unique_array()
        uebernommen.
        
        Das Resultat von unique_array() hat die Form:

            ({ ({same1:1, same1:2, ... same1:n}),
               ({same2:1, same2:2, ... same2:n}),
               ({samem:1, samem:2, ... samem:n}) })

BEISPIELE
        Um ein Array von Arrays zu erhalten, das alle Benutzer, nach Level
        gruppiert, enthaelt:

            mixed *arr;
            arr = unique_array(users(), "_query_level", -1);

        Goetter haben einen Level von -1. Sie werden nicht in arr aufgenommen,
        weil <skip> == -1.

SIEHE AUCH
        filter(E), map(E)
