44
55namespace  BenTools \IterableFunctions ;
66
7- use  EmptyIterator ;
7+ use  CallbackFilterIterator ;
88use  IteratorAggregate ;
9+ use  IteratorIterator ;
910use  Traversable ;
1011
12+ use  function  array_filter ;
13+ use  function  array_map ;
14+ use  function  iterator_to_array ;
15+ 
1116/** 
1217 * @internal 
1318 * 
@@ -18,73 +23,51 @@ final class IterableObject implements IteratorAggregate
1823    /** @var iterable<mixed> */ 
1924    private  $ iterable ;
2025
21-     /** @var callable|null */ 
22-     private  $ filterFn ;
23- 
24-     /** @var callable|null */ 
25-     private  $ mapFn ;
26- 
27-     /** 
28-      * @param iterable<mixed>|null $iterable 
29-      */ 
30-     private  function  __construct (?iterable  $ iterable  = null , ?callable  $ filter  = null , ?callable  $ map  = null )
31-     {
32-         $ this  ->iterable  = $ iterable  ?? new  EmptyIterator ();
33-         $ this  ->filterFn  = $ filter ;
34-         $ this  ->mapFn  = $ map ;
35-     }
36- 
3726    /** 
38-      * @param iterable<mixed>|null  $iterable 
27+      * @param iterable<mixed> $iterable 
3928     */ 
40-     public  static   function  new (? iterable  $ iterable =  null ):  self 
29+     public  function  __construct ( iterable  $ iterable) 
4130    {
42-         return   new   self ( $ iterable) ;
31+         $ this -> iterable  =  $ iterable ;
4332    }
4433
4534    public  function  filter (?callable  $ filter  = null ): self 
4635    {
47-         $ filter  = $ filter  ?? function  ($ value ): bool  {
48-             return  (bool ) $ value ;
49-         };
36+         if  ($ this  ->iterable  instanceof  Traversable) {
37+             $ filter  = $ filter  ??
38+                 /** @param mixed $value */ 
39+                 static  function  ($ value ): bool  {
40+                     return  (bool ) $ value ;
41+                 };
42+ 
43+             return  new  self (new  CallbackFilterIterator (new  IteratorIterator ($ this  ->iterable ), $ filter ));
44+         }
45+ 
46+         $ filtered  = $ filter  === null  ? array_filter ($ this  ->iterable ) : array_filter ($ this  ->iterable , $ filter );
5047
51-         return  new  self ($ this -> iterable ,  $ filter ,  $ this -> mapFn );
48+         return  new  self ($ filtered  );
5249    }
5350
54-     public  function  map (callable  $ map  ): self 
51+     public  function  map (callable  $ mapper  ): self 
5552    {
56-         return  new  self ($ this  ->iterable , $ this  ->filterFn , $ map );
53+         if  ($ this  ->iterable  instanceof  Traversable) {
54+             return  new  self (new  MappedTraversable ($ this  ->iterable , $ mapper ));
55+         }
56+ 
57+         return  new  self (array_map ($ mapper , $ this  ->iterable ));
5758    }
5859
5960    /** 
6061     * @return Traversable<mixed> 
6162     */ 
6263    public  function  getIterator (): Traversable 
6364    {
64-         $ iterable  = $ this  ->iterable ;
65-         if  ($ this  ->filterFn  !== null ) {
66-             $ iterable  = iterable_filter ($ iterable , $ this  ->filterFn );
67-         }
68- 
69-         if  ($ this  ->mapFn  !== null ) {
70-             $ iterable  = iterable_map ($ iterable , $ this  ->mapFn );
71-         }
72- 
73-         return  iterable_to_traversable ($ iterable );
65+         yield  from  $ this  ->iterable ;
7466    }
7567
7668    /** @return array<mixed> */ 
7769    public  function  asArray (): array 
7870    {
79-         $ iterable  = $ this  ->iterable ;
80-         if  ($ this  ->filterFn  !== null ) {
81-             $ iterable  = iterable_filter ($ iterable , $ this  ->filterFn );
82-         }
83- 
84-         if  ($ this  ->mapFn  !== null ) {
85-             $ iterable  = iterable_map ($ iterable , $ this  ->mapFn );
86-         }
87- 
88-         return  iterable_to_array ($ iterable );
71+         return  $ this  ->iterable  instanceof  Traversable ? iterator_to_array ($ this  ->iterable ) : $ this  ->iterable ;
8972    }
9073}
0 commit comments