@@ -839,6 +839,7 @@ impl Compiler {
839
839
node
840
840
}
841
841
Un => {
842
+ invert:: dbgln!( "\n //////////////\n // begin UN //\n //////////////" ) ;
842
843
let ( sn, span) = self . monadic_modifier_op ( modified) ?;
843
844
self . add_span ( span. clone ( ) ) ;
844
845
let mut normal = sn. un_inverse ( & self . asm ) ;
@@ -847,15 +848,21 @@ impl Compiler {
847
848
* e = InversionError :: Pretty ;
848
849
}
849
850
}
850
- let cust = CustomInverse {
851
- normal,
852
- un : Some ( sn) ,
853
- ..Default :: default ( )
854
- } ;
855
- let span = self . add_span ( modified. modifier . span . clone ( ) ) ;
856
- Node :: CustomInverse ( cust. into ( ) , span)
851
+ invert:: dbgln!( "////////////\n // end UN //\n ////////////\n " ) ;
852
+ if let Ok ( Node :: CustomInverse ( ..) ) = normal. as_ref ( ) . map ( |sn| & sn. node ) {
853
+ normal. unwrap ( ) . node
854
+ } else {
855
+ let cust = CustomInverse {
856
+ normal,
857
+ un : Some ( sn) ,
858
+ ..Default :: default ( )
859
+ } ;
860
+ let span = self . add_span ( modified. modifier . span . clone ( ) ) ;
861
+ Node :: CustomInverse ( cust. into ( ) , span)
862
+ }
857
863
}
858
864
Anti => {
865
+ invert:: dbgln!( "\n ////////////////\n // begin ANTI //\n ////////////////" ) ;
859
866
let ( sn, span) = self . monadic_modifier_op ( modified) ?;
860
867
self . add_span ( span. clone ( ) ) ;
861
868
let normal = sn. anti_inverse ( & self . asm ) ;
@@ -866,9 +873,11 @@ impl Compiler {
866
873
..Default :: default ( )
867
874
} ;
868
875
let span = self . add_span ( modified. modifier . span . clone ( ) ) ;
876
+ invert:: dbgln!( "//////////////\n // end ANTI //\n //////////////\n " ) ;
869
877
Node :: CustomInverse ( cust. into ( ) , span)
870
878
}
871
879
Under => {
880
+ invert:: dbgln!( "\n /////////////////\n // begin UNDER //\n /////////////////" ) ;
872
881
let ( f, g, f_span, _) = self . dyadic_modifier_ops ( modified) ?;
873
882
let normal = {
874
883
let ( f_before, f_after) = f
@@ -883,27 +892,19 @@ impl Compiler {
883
892
} ;
884
893
let span = self . add_span ( modified. modifier . span . clone ( ) ) ;
885
894
let un = if normal. sig == ( 1 , 1 ) || self . allow_experimental ( ) {
886
- if f. sig . args ( ) == f. sig . outputs ( ) {
887
- let ( f_before, f_after) = f
888
- . node
889
- . under_inverse ( g. sig , true , & self . asm )
890
- . map_err ( |e| self . error ( f_span. clone ( ) , e) ) ?;
891
- ( g. node . un_inverse ( & self . asm ) . ok ( ) )
892
- . map ( |g_inv| -> UiuaResult < SigNode > {
893
- let mut node = f_before;
894
- node. push ( g_inv) ;
895
- node. push ( f_after) ;
896
- let sig = self . sig_of ( & node, & f_span) ?;
897
- Ok ( SigNode :: new ( sig, node) )
898
- } )
899
- . transpose ( ) ?
900
- } else {
901
- let cust = CustomInverse :: from ( InversionError :: UnUnderSignature ( f. sig ) ) ;
902
- Some ( SigNode :: new (
903
- normal. sig . inverse ( ) ,
904
- Node :: CustomInverse ( cust. into ( ) , span) ,
905
- ) )
906
- }
895
+ let ( f_before, f_after) = f
896
+ . node
897
+ . under_inverse ( g. sig , true , & self . asm )
898
+ . map_err ( |e| self . error ( f_span. clone ( ) , e) ) ?;
899
+ ( g. node . un_inverse ( & self . asm ) . ok ( ) )
900
+ . map ( |g_inv| -> UiuaResult < SigNode > {
901
+ let mut node = f_before;
902
+ node. push ( g_inv) ;
903
+ node. push ( f_after) ;
904
+ let sig = self . sig_of ( & node, & f_span) ?;
905
+ Ok ( SigNode :: new ( sig, node) )
906
+ } )
907
+ . transpose ( ) ?
907
908
} else {
908
909
let cust = CustomInverse :: from ( InversionError :: UnUnderExperimental ) ;
909
910
Some ( SigNode :: new (
@@ -912,7 +913,7 @@ impl Compiler {
912
913
) )
913
914
} ;
914
915
let under = if normal. sig . args ( ) == normal. sig . outputs ( ) {
915
- Some ( ( normal . clone ( ) , normal. clone ( ) ) )
916
+ un . clone ( ) . map ( |un| ( normal. clone ( ) , un ) )
916
917
} else {
917
918
None
918
919
} ;
@@ -923,6 +924,7 @@ impl Compiler {
923
924
..Default :: default ( )
924
925
} ;
925
926
let span = self . add_span ( modified. modifier . span . clone ( ) ) ;
927
+ invert:: dbgln!( "///////////////\n // end UNDER //\n ///////////////\n " ) ;
926
928
Node :: CustomInverse ( cust. into ( ) , span)
927
929
}
928
930
Obverse => {
0 commit comments