
    rh                    v    S SK Jr  S SKrS SKr " S S5      rS rS rS rS rS	 r	S
 r
\S:X  a	   \" 5         gg)    )annotationsNc                  .    \ rS rSrSS jrSS jrS rSrg)TreeYielder   Nc                    / U l         SU l        Xl        / U l        [        [
        [        [        S5      [        /U l	        g)z
`yieldValue` should be a lambda function that
returns True/False or a function/method call that
will be passed the value of a current attribute
N)
currentStackmemo
yieldValue	stackValsintstrfloattypeboolnonIterables)selfr
   s     P/home/james-whalen/.local/lib/python3.13/site-packages/music21/test/treeYield.py__init__TreeYielder.__init__   s9     	$ #"DJ6    c              #    #    Uc  0 nX l         [        U5      U R                   ;   a!  U R                   [        U5      ==   S-  ss'   gSU R                   [        U5      '   U R                  U5      SL a  Uv   U R                  R	                  U5        [        U5      nX0R                  ;   a  GOdU[        :X  a^  U HW  nSU4nU R                  R	                  U5        X   nU R                  XbS9 Sh  vN   U R                  R                  5         MY     OU[        [        4;   ae  [        U5       HU  u  pvSU4nU R                  R	                  U5        U R                  XbS9 Sh  vN   U R                  R                  5         MW     O [        R                  US5      n	U	 Hj  n [        R                  X5      n
SU4nU R                  R	                  U5         U R                  XS9 Sh  vN   U R                  R                  5         Ml     U R                  R                  5         g GN; N! [          a     gf = f! ["         a     M  f = f Nc! [$         a    ['        S	U R)                  5        35      ef = f7f)
z
traverse all attributes of an object looking
for subObjects that meet a certain criteria.
yield them.

`memo` is a dictionary to keep track of objects
that have already been seen

The original object is added to the memo and
also checked for yieldValue
N   Tdict)r	   listLike__dict__getattrzMaximum recursion on:
)r	   idr
   r   appendr   r   r   r   runpoplisttuple	enumerateobject__getattribute__AttributeError	ExceptionRuntimeError
ValueErrorcurrentLevel)r   objr	   tObjkeyX	dictTuplexi	listTupleinstance_dictgotValueobjTuples               r   r   TreeYielder.run"   sD     <D	c7diiIIbg!#!"DIIbg??34'I 	  %Cy$$$T\#TN	%%i0I88A8111""$  dE]"!#'O	%%i088A8111""$	 ' & 7 7Z H
 #%66s>H &q>%%h/V#xxx<<< ""$ # 	A 2 2 "  ! 
 =# V$'>t?P?P?R>S%TUUVs   C1J 3H.4A4J (H1)#J H3 #J )I>J I0I1I5:J 1J 3
I =J ?I  J 
IJ IJ I'I==J c                (   SnU R                    H  u  p#US:X  a8  [        U[        5      (       a  USU-   S-   -  nM-  US[        U5      -   S-   -  nMC  US:X  a  US[        U5      -   S-   -  nM_  US:X  a  US	U-   S
-   -  nMr  [        SU< 35      e   U$ )N r   z['z'][]r   r   z.__getattribute__('z')z#Cannot get attribute for stackType )r   
isinstancer   r)   )r   
currentStr	stackType
stackValues       r   r*   TreeYielder.currentLevelg   s    
%)^^!IF"j#..$"3d"::J#J"7#"==Jj(cC
O3c99
i'3j@4GG
 #Fym!TUU &4 r   )r   r	   r   r   r
   N)__name__
__module____qualname____firstlineno__r   r   r*   __static_attributes__ r   r   r   r      s    6C Jr   r   c            	        ^  " U4S jS5      mS n / SQnSS/ SQSS	S
T" U5      S.ST" U5      /nUR                  U5        [        U 5      nUR                  U5       H  n[        XCR	                  5       5        M     g )Nc                  &   > \ rS rSrSU 4S jjrSrg)testCode.<locals>.Mocky   c                d   > SU l         Xl        XS/U l        S U l        USL a  T" USS9U l        g g )N   (   TF)	embedMock)abbymockermockListembeddedMock)r   	mockThingrM   Mocks      r   r   testCode.<locals>.Mock.__init__z   s?    DI#K&26DM $DD $(e$D! !r   )rN   rQ   rP   rO   N)T)r@   rA   rB   rC   r   rD   )rS   s   r   rS   rH   y   s    	E 	Er   rS   c                4    U R                   R                  S:H  $ )NrS   )	__class__r@   r/   s    r   mockTypetestCode.<locals>.mockType   s    {{##v--r   )d   <      r   )r]         rK   
      )hellogoodbyemocki)r   r   r   printr*   )rX   subListmyListtyvalrS   s        @r   testCoderj   x   sy    E E. G["r4=A3WWF
MM&	X	Bvvf~c??$% r   c                 <   SSK Jn   SSK Jn  SSK Jn  UR	                  5       S-  S-  S-  nU R                  U5      nUR                  U5      nUR                  5         S n[        U5      nUR                  U5       H  n[        XR                  5       5        M     g )	Nr   )	converter)common)
freezeThawmiditestPrimitivez
test03.midc                6    [        U [        R                  5      $ r?   )r:   weakrefReferenceTyperW   s    r   rX   testMIDIParse.<locals>.mockType   s    !W2233r   )music21rl   rm   rn   getSourceFilePathparseStreamFreezersetupSerializationScaffoldr   r   re   r*   )	rl   rm   rn   acvrX   rh   ri   s	            r   testMIDIParser}      s    !" 	  "V+o=LA 	A  #A  "4 
X	Bvvayc??$% r   c                     [        S 5      $ )Nc                J    [        U [        R                  R                  5      $ r?   )
issubclassru   exceptions21Music21Exceptionmms    r   <lambda>3find_all_exception_classes_in_m21.<locals>.<lambda>   s    :b'"6"6"G"GHr   find_all_classes_by_criteriarE   r   r   !find_all_exception_classes_in_m21r      s    'H r   c                     S n [        U 5      $ )Nc                    [        U [        R                  R                  5      (       d  g U " 5       1  g! [         a  nS[        U5      ;   s S nA$ S nAff = f)NF
unhashable)r   ru   baseMusic21Object	TypeErrorr   )r   tes     r   is_unhashable7find_all_non_hashable_m21objects.<locals>.is_unhashable   sN    "gll8899	+TF   	+3r7**	+s   5 
AAAAr   )r   s    r    find_all_non_hashable_m21objectsr      s     (66r   c                     S n [        U 5      $ )Nc                    [        U [        R                  R                  5      (       d  g U " 5         g! [         a     gf = f)NFT)r   ru   r   r   r   r   s    r   needs_attributesGfind_all_non_default_instantiation_m21objects.<locals>.needs_attributes   s?    "gll8899	D   		s   4 
A Ar   )r   s    r   -find_all_non_default_instantiation_m21objectsr      s     ((899r   c                   SSK Jn  SS KnU" [        /5      n[	        5       n[	        5       nU(       a  UR                  5       nXd;   a  M  [        U5        [        U5       H  n[        Xg5      n[        XR                  5      (       a)  X;  a$  S[        USS5      ;   a  UR                  U5        MQ  [        U[        5      (       d  Mh  X;  d  Mo  U " U5      (       d  M~  UR                  U5        M     UR                  U5        U(       a  M  U$ )Nr   )dequeru   __file__r7   )collectionsr   typesru   setpopleftre   dirr   r:   
ModuleTyper   r   add)	criteriar   r   dseenmatchesmmm_namer   s	            r   r   r      s    !wiA5DeG
IIK9a1vG$B2//00!WRR%@@B%%".Xb\\B  	 ! Nr   __main__)
__future__r   rr   ru   r   rj   r}   r   r   r   r   r@   rE   r   r   <module>r      sR    #  a aH&.&6

7:2 zO r   