 public func <- <T: SignedInteger>(left: inout T, right: Map) {
 	switch right.mappingType {
 	case .fromJSON where right.isKeyPresent:
-		let value = (right.currentValue as? Int).flatMap(IntMax.init).flatMap(T.init)
+		let value: T = toSignedInteger(right.currentValue) ?? 0
 		FromJSON.basicType(&left, object: value)
 	case .toJSON:
 		left >>> right

public func <- <T: SignedInteger>(left: inout T?, right: Map) {
	switch right.mappingType {
	case .fromJSON where right.isKeyPresent:
		let value = (right.currentValue as? Int).flatMap(IntMax.init).flatMap(T.init)
		FromJSON.basicType(&left, object: value)
	case .toJSON:
		left >>> right

public func <- <T: UnsignedInteger>(left: inout T, right: Map) {
	switch right.mappingType {
	case .fromJSON where right.isKeyPresent:
		let value: T = toUnsignedInteger(right.currentValue) ?? 0
		FromJSON.basicType(&left, object: value)
	case .toJSON:
		left >>> right
