1111use std:: collections:: { BTreeSet , BTreeMap , LinkedList } ;
1212use std:: cmp:: { Ordering , Ord , PartialOrd } ;
1313use std:: fmt:: { Display , Formatter } ;
14+ use std:: f64;
1415
1516use symbols;
1617use num:: BigInt ;
@@ -54,7 +55,19 @@ impl Display for Value {
5455 Boolean ( v) => write ! ( f, "{}" , v) ,
5556 Integer ( v) => write ! ( f, "{}" , v) ,
5657 BigInteger ( ref v) => write ! ( f, "{}N" , v) ,
57- Float ( OrderedFloat ( v) ) => write ! ( f, "{}" , v) ,
58+ Float ( ref v) => {
59+ // TODO: make sure float syntax is correct.
60+ if * v == OrderedFloat ( f64:: INFINITY ) {
61+ write ! ( f, "#f {}" , "+Infinity" )
62+ } else if * v == OrderedFloat ( f64:: NEG_INFINITY ) {
63+ write ! ( f, "#f {}" , "-Infinity" )
64+ } else if * v == OrderedFloat ( f64:: NAN ) {
65+ write ! ( f, "#f {}" , "NaN" )
66+ } else {
67+ write ! ( f, "{}" , v)
68+ }
69+ }
70+ // TODO: EDN escaping.
5871 Text ( ref v) => write ! ( f, "{}" , v) ,
5972 PlainSymbol ( ref v) => v. fmt ( f) ,
6073 NamespacedSymbol ( ref v) => v. fmt ( f) ,
@@ -266,6 +279,7 @@ mod test {
266279
267280 use std:: collections:: { BTreeSet , BTreeMap , LinkedList } ;
268281 use std:: cmp:: { Ordering } ;
282+ use std:: f64;
269283
270284 use symbols;
271285 use num:: BigInt ;
@@ -280,7 +294,7 @@ mod test {
280294
281295 #[ test]
282296 fn test_print_edn ( ) {
283- assert_eq ! ( "[ 1 2 ( 3.14 ) #{ 4N } { :foo/bar 42 } [ ] :five :six/seven eight nine/ten true false nil ]" ,
297+ assert_eq ! ( "[ 1 2 ( 3.14 ) #{ 4N } { :foo/bar 42 } [ ] :five :six/seven eight nine/ten true false nil #f NaN #f -Infinity #f +Infinity ]" ,
284298 Value :: Vector ( vec![
285299 Value :: Integer ( 1 ) ,
286300 Value :: Integer ( 2 ) ,
@@ -300,7 +314,10 @@ mod test {
300314 Value :: NamespacedSymbol ( symbols:: NamespacedSymbol :: new( "nine" , "ten" ) ) ,
301315 Value :: Boolean ( true ) ,
302316 Value :: Boolean ( false ) ,
303- Value :: Nil
317+ Value :: Nil ,
318+ Value :: Float ( OrderedFloat ( f64 :: NAN ) ) ,
319+ Value :: Float ( OrderedFloat ( f64 :: NEG_INFINITY ) ) ,
320+ Value :: Float ( OrderedFloat ( f64 :: INFINITY ) ) ,
304321 ]
305322 ) . to_string( ) ) ;
306323 }
@@ -323,4 +340,4 @@ mod test {
323340 assert_eq ! ( Value :: Set ( BTreeSet :: new( ) ) . cmp( & Value :: Set ( BTreeSet :: new( ) ) ) , Ordering :: Equal ) ;
324341 assert_eq ! ( Value :: Map ( BTreeMap :: new( ) ) . cmp( & Value :: Map ( BTreeMap :: new( ) ) ) , Ordering :: Equal ) ;
325342 }
326- }
343+ }
0 commit comments