filter
======

BEMERKUNGEN
-----------

  1. Achtung, die Elemente in 'arr' werden nicht tief kopiert, sind sie
     also selbst Arrays oder Mappings, so fuehrt eine spaetere Aenderung
     im Rueckgabe-Arrays zur Aenderung im Ursprungsarray:

     .. code-block:: pike

       int *i, *j;
       i=({({1,2,3}),({4,5,6})});
       j=filter(i, #'sizeof);     // filtert leere Arrays heraus
       j[0][0]=8;

    fuehrt zu: i==j==({({8,2,3}),({4,5,6})});

  2. Das Kopieren in das Rueckgabemapping erfolgt fuer jedes Element nach
     Ausfuehrung der Filtermethode. Aenderungen der Werte im Array in dieser
     Methode (globale Variable/Uebergabe als Referenz an filter)
     schlagen sich also im Rueckgabearray nieder.

  3. Fuer Arrays wirkt filter() wie filter_array(), fuer Mappings stellt
     filter() eine Verallgemeinerung von filter_indices() dar.

BEISPIELE
---------

::

    ### Filtere alle Lebewesen in einem Raum in ein Array ###
    filter(all_inventory(this_object()),#'living);

    ### Filtere alle tauben Spieler im Raum in ein Array ###
    static int filter_isdeaf(object who) {
      return (interactive(who) && who->QueryProp(P_DEAF));
    }

    filter(all_inventory(this_object()), #'filter_isdeaf);


    ### Filtern von Idlern (>=1 Sekunde idle) ###
    // Folgend identische Resultate, aber andere Ansaetze:

    #1: nutzt die Efun query_idle() als Lfun-Closure (ideal hier)
        idle_usr = filter(users(), #'query_idle );

    #2: mit Filtermethode
        int check_if_idle(object user) {
          return query_idle(user);
        }

        #2a: filtert mittels der Lfun im selben Objekt die Idler in das
             Rueckgabearray
             idle_usr = filter(users(), "check_if_idle");
             idle_usr = filter(users(), "check_if_idle", this_object());

        #2b: ruft die Lfun check_if_idle() als Lfun-Closure (Funktions-
             pointer)
             idle_usr = filter(users(), #'check_if_idle );

    #3: Nutzt eine Inline-Closure
        idle_usr = filter(users(), function int (object user) {
                     return query_idle(user);
                   } );

    ### Filtern von Idlern (>=20 Sekunden idle) mit Extraparameter ###
    // Folgend identische Resultate, aber andere Ansaetze:

    #1: die Efun koennen wir nicht mehr direkt nutzen, weil sie
        diesen Parameter nicht unterstuetzt
       // idle_usr = filter(users(), #'query_idle );

    #2: mit separater Filtermethode ... mit neuem Parameter
        int check_if_idle(object user, int length) {
          return query_idle(user)>length;
        }

        #2a: filtert mittels der Lfun im selben Objekt die Idler in das
             Rueckgabearray ... mit drittem Parameter!
             idle_usr = filter(users(), "check_if_idle", this_object(), 20);

        #2b: ruft die Lfun check_if_idle() als Lfun-Closure (Funktions-
             pointer)
             idle_usr = filter(users(), #'check_if_idle, 20);

    #3: Nutzt eine Inline-Closure
        idle_usr = filter(users(), function int (object user, int length) {
                     return (query_idle(user) > length); 
                     }, 20);