@@ -1789,29 +1789,34 @@ fn digits_needed_for_base(n: f64, base: f64) -> usize {
17891789 }
17901790}
17911791
1792+ fn validate_base ( base : f64 , env : & Uiua ) -> UiuaResult {
1793+ if base == 0.0 {
1794+ Err ( env. error ( "Base cannot be 0" ) )
1795+ } else if base == 1.0 {
1796+ Err ( env. error ( "Base cannot be 1" ) )
1797+ } else if base == -1.0 {
1798+ Err ( env. error ( "Base cannot be ¯1" ) )
1799+ } else if base. is_nan ( ) {
1800+ Err ( env. error ( "Base cannot be NaN" ) )
1801+ } else if ( -1.0 ..0.0 ) . contains ( & base) {
1802+ Err ( env. error ( "Base cannot be between ¯1 and 0" ) )
1803+ } else {
1804+ Ok ( ( ) )
1805+ }
1806+ }
1807+
17921808impl < T : RealArrayValue + GridFmt > Array < T > {
17931809 fn base_scalar ( & self , base : f64 , env : & Uiua ) -> UiuaResult < Array < f64 > > {
1794- if base == 0.0 {
1795- return Err ( env. error ( "Base cannot be 0" ) ) ;
1796- }
1797- if base == 1.0 {
1798- return Err ( env. error ( "Base cannot be 1" ) ) ;
1799- }
1800- if base == -1.0 {
1801- return Err ( env. error ( "Base cannot be ¯1" ) ) ;
1802- }
1810+ validate_base ( base, env) ?;
1811+
1812+ // Validation
18031813 if base. is_infinite ( ) {
18041814 return Err ( env. error ( "Base cannot be infinite" ) ) ;
18051815 }
1806- if base. is_nan ( ) {
1807- return Err ( env. error ( "Base cannot be NaN" ) ) ;
1808- }
1809- if ( -1.0 ..0.0 ) . contains ( & base) {
1810- return Err ( env. error ( "Base cannot be between ¯1 and 0" ) ) ;
1811- }
18121816 if let Some ( n) = self . data . iter ( ) . find ( |n| n. to_f64 ( ) . is_infinite ( ) ) {
18131817 return Err ( env. error ( format ! ( "Cannot take base of {}" , n. grid_string( false ) ) ) ) ;
18141818 }
1819+
18151820 Ok ( if base >= 0.0 {
18161821 let max_row_len = ( self . data . iter ( ) )
18171822 . map ( |& n| digits_needed_for_base ( n. to_f64 ( ) , base) )
@@ -1859,17 +1864,17 @@ impl<T: RealArrayValue + GridFmt> Array<T> {
18591864 }
18601865 fn base_list ( & self , bases : & [ f64 ] , env : & Uiua ) -> UiuaResult < Array < f64 > > {
18611866 let fill = env. scalar_fill :: < f64 > ( ) . ok ( ) . map ( |fv| fv. value ) ;
1867+ // Validation
18621868 for base in bases. iter ( ) . copied ( ) . chain ( fill) {
1863- if base == 0.0 {
1864- return Err ( env. error ( "Base cannot contain 0s" ) ) ;
1865- }
18661869 if base. is_infinite ( ) && base. is_sign_negative ( ) {
18671870 return Err ( env. error ( "Base cannot contain negative infinities" ) ) ;
18681871 }
1869- if base. is_nan ( ) {
1870- return Err ( env. error ( "Base cannot contain NaNs" ) ) ;
1871- }
1872+ validate_base ( base, env) ?;
18721873 }
1874+ if let Some ( n) = self . data . iter ( ) . find ( |n| n. to_f64 ( ) . is_infinite ( ) ) {
1875+ return Err ( env. error ( format ! ( "Cannot take base of {}" , n. grid_string( false ) ) ) ) ;
1876+ }
1877+
18731878 let fill_digits = if let Some ( fill) = fill {
18741879 let product: f64 = bases. iter ( ) . product ( ) ;
18751880 self . data
0 commit comments