@@ -634,6 +634,8 @@ public func == (lhs: Map, rhs: Map) -> Bool {
634634 switch ( lhs, rhs) {
635635 case ( . null, . null) :
636636 return true
637+ case let ( . bool( l) , . bool( r) ) where l == r:
638+ return true
637639 case let ( . number( l) , . number( r) ) where l == r:
638640 return true
639641 case let ( . string( l) , . string( r) ) where l == r:
@@ -747,7 +749,35 @@ extension Map:CustomDebugStringConvertible {
747749extension Map {
748750 public func description( debug: Bool ) -> String {
749751 var indentLevel = 0
750-
752+
753+ let escapeMapping : [ Character : String ] = [
754+ " \r " : " \\ r " ,
755+ " \n " : " \\ n " ,
756+ " \t " : " \\ t " ,
757+ " \\ " : " \\ \\ " ,
758+ " \" " : " \\ \" " ,
759+
760+ " \u{2028} " : " \\ u2028 " ,
761+ " \u{2029} " : " \\ u2029 " ,
762+
763+ " \r \n " : " \\ r \\ n "
764+ ]
765+
766+ func escape( _ source: String ) -> String {
767+ var string = " \" "
768+
769+ for character in source {
770+ if let escapedSymbol = escapeMapping [ character] {
771+ string. append ( escapedSymbol)
772+ } else {
773+ string. append ( character)
774+ }
775+ }
776+
777+ string. append ( " \" " )
778+ return string
779+ }
780+
751781 func serialize( map: Map ) -> String {
752782 switch map {
753783 case . null:
@@ -756,30 +786,30 @@ extension Map {
756786 return value. description
757787 case let . number( number) :
758788 return number. description
759- case . string( let string) :
760- return string
761- case . array( let array) :
789+ case let . string( string) :
790+ return escape ( string)
791+ case let . array( array) :
762792 return serialize ( array: array)
763- case . dictionary( let dictionary) :
793+ case let . dictionary( dictionary) :
764794 return serialize ( dictionary: dictionary)
765795 }
766796 }
767-
797+
768798 func serialize( array: [ Map ] ) -> String {
769799 var string = " [ "
770-
800+
771801 if debug {
772802 indentLevel += 1
773803 }
774-
804+
775805 for index in 0 ..< array. count {
776806 if debug {
777807 string += " \n "
778808 string += indent ( )
779809 }
780-
810+
781811 string += serialize ( map: array [ index] )
782-
812+
783813 if index != array. count - 1 {
784814 if debug {
785815 string += " , "
@@ -788,43 +818,43 @@ extension Map {
788818 }
789819 }
790820 }
791-
821+
792822 if debug {
793823 indentLevel -= 1
794824 return string + " \n " + indent( ) + " ] "
795825 } else {
796826 return string + " ] "
797827 }
798828 }
799-
829+
800830 func serialize( dictionary: [ String : Map ] ) -> String {
801831 var string = " { "
802832 var index = 0
803-
833+
804834 if debug {
805835 indentLevel += 1
806836 }
807-
837+
808838 for (key, value) in dictionary. sorted ( by: { $0. 0 < $1. 0 } ) {
809839 if debug {
810840 string += " \n "
811841 string += indent ( )
812- string += key + " : " + serialize( map: value)
842+ string += escape ( key) + " : " + serialize( map: value)
813843 } else {
814- string += key + " : " + serialize( map: value)
844+ string += escape ( key) + " : " + serialize( map: value)
815845 }
816-
846+
817847 if index != dictionary. count - 1 {
818848 if debug {
819849 string += " , "
820850 } else {
821851 string += " , "
822852 }
823853 }
824-
854+
825855 index += 1
826856 }
827-
857+
828858 if debug {
829859 indentLevel -= 1
830860 return string + " \n " + indent( ) + " } "
0 commit comments