Returns a normalized form of the passed object.
Returns a normalized form of the passed object.
If the passed object is already in normal form, this method may return the same instance passed.
the object to normalize
the normalized form of the passed object
Indicates whether this Uniformity's normalized method can “handle” the passed object, if cast to the
appropriate type A.”“
Indicates whether this Uniformity's normalized method can “handle” the passed object, if cast to the
appropriate type A.
If this method returns true for a particular passed object, it means that if the object is passed
to normalizedOrSame, that method will return the result of passing it to normalized.
It does not mean that the object will necessarily be modified when passed to normalizedOrSame or normalized.
For example, the lowerCased field of StringNormalizations is a Uniformity[String]
that normalizes strings by forcing all characters to lower case:
scala> import org.scalactic._ import org.scalactic._scala> import StringNormalizations._ import StringNormalizations._
scala> lowerCased res0: org.scalactic.Uniformity[String] = lowerCased
scala> lowerCased.normalized("HALLOOO!") res1: String = hallooo!
Now consider two strings held from variables of type AnyRef:
scala> val yell: AnyRef = "HOWDY" yell: AnyRef = HOWDYscala> val whisper: AnyRef = "howdy" whisper: AnyRef = howdy
As you would expect, when yell is passed to normalizedCanHandle, it returns true, and when
yell is passed to normalizedOrSame, it returns a lower-cased (normal) form:
scala> lowerCased.normalizedCanHandle(yell) res2: Boolean = truescala> lowerCased.normalizedOrSame(yell) res3: Any = howdy
A similar thing happens, however, when whisper is passed to normalizedCanHandle and normalizedOrSame,
even though in this case the string is already in normal form according to the lowerCased Uniformity:
scala> lowerCased.normalizedCanHandle(whisper) res4: Boolean = truescala> lowerCased.normalizedOrSame(whisper) res5: Any = howdy
This illustrates that normalizedCanHandle does not indicate that the passed object is not in normalized form already, just that
it can be be handled by the normalized method. This further means that the normalized method itself
simply ensures that objects are returned in normal form. It need not necessarily change them: if a passed object is already in
normal form, normalized can (and usually should) return the exact same object. That is in fact what happened when we normalized
whisper. Since whisper's value of "hello" was already in normal form (all lower-cased), normalized (
invoked by the normalizedOrSame method) returned the exact same object passed:
scala> val whisperNormed = res5.asInstanceOf[AnyRef] whisperNormed: AnyRef = howdyscala> whisperNormed eq whisper res8: Boolean = true
Returns either the result of passing this object to normalized, if appropriate, or the same object.
Returns either the result of passing this object to normalized, if appropriate, or the same object.
Implementations can decide what “appropriate” means, but the intent is that it will usually mean the
value passed is of the type A. For example, if this is a Uniformity[String], appropriate means
that the value (of type Any) passed is actually an instance of String. Because of erasure,
however, a Uniformity[List[String]] will only be able to tell whether a value is a List[_],
so it might declare any List[_] that contains only Strings (determined by invoking
isInstanceOf[String] on each element) to be appropriate. This means a Uniformity[List[String]] might normalize
a List[AnyRef] that happens to contain only Strings.
the object to normalize, if appropriate
a normalized form of the passed object, if this Uniformity was able to normalize it, else the same object passed
Returns a new Uniformity that combines this and the passed Uniformity.
Returns a new Uniformity that combines this and the passed Uniformity.
The normalized and normalizedOrSame methods
of the Uniformity returned by this method return a result
obtained by forwarding the passed value first to this Uniformity's implementation of the method,
then passing that result to the other Uniformity's implementation of the method, respectively.
Essentially, the body of the composed normalized method is:
uniformityPassedToAnd.normalized(uniformityOnWhichAndWasInvoked.normalized(a))
And the body of the composed normalizedOrSame method is:
uniformityPassedToAnd.normalizedOrSame(uniformityOnWhichAndWasInvoked.normalizedOrSame(a))
The normalizeCanHandle method of the Uniformity returned by this method returns a result
obtained by anding the result of forwarding the passed value to this Uniformity's implementation of the method
with the result of forwarding it to the passed Uniformity's implementation.
Essentially, the body of the composed normalizeCanHandle method is:
uniformityOnWhichAndWasInvoked.normalizeCanHandle(a) && uniformityPassedToAnd.normalizeCanHandle(a)
a Uniformity to 'and' with this one
a Uniformity representing the composition of this and the passed Uniformity
Returns a new Normalization that composes this and the passed Normalization.
Returns a new Normalization that composes this and the passed Normalization.
The normalized method of the Normalization returned by this method returns a normalized form of the passed
object obtained by forwarding the passed value first to this Normalization's normalized method,
then passing that result to the other Normalization's normalized method.
Essentially, the body of the composed normalized method is:
normalizationPassedToAnd.normalized(normalizationOnWhichAndWasInvoked.normalized(a))
a Normalization to 'and' with this one
a Normalization representing the composition of this and the passed Normalization
Converts this Uniformity to a NormalizingEquality[A] whose normalized,
normalizedCanHandle, and normalizedOrSame methods delegate
to this Uniformity[A] and whose afterNormalizationEquality field returns the
implicitly passed Equality[A].
Converts this Uniformity to a NormalizingEquality[A] whose normalized,
normalizedCanHandle, and normalizedOrSame methods delegate
to this Uniformity[A] and whose afterNormalizationEquality field returns the
implicitly passed Equality[A].
the Equality that the returned NormalizingEquality
will delegate to determine equality after normalizing both left and right (if appropriate) sides.
Converts this Normalization to a NormalizingEquivalence[A] whose normalized
method delegates to this Normalization[A] and whose afterNormalizationEquivalence field returns the
implicitly passed Equivalence[A].
Converts this Normalization to a NormalizingEquivalence[A] whose normalized
method delegates to this Normalization[A] and whose afterNormalizationEquivalence field returns the
implicitly passed Equivalence[A].
the Equivalence that the returned NormalizingEquivalence
will delegate to determine equality after normalizing both left and right (if appropriate) sides.
Defines a custom way to normalize instances of a type that can also handle normalization of that type when passed as
Any.For example, to normalize
Doubles by truncating off any decimal part, you might write:Given this definition you could use it with the
ExplicitlyDSL like this:If you make the
truncatedvalimplicit and import or mix in the members ofNormMethods, you can access the behavior by invoking.normonDoubles.Note that by creating a
Uniformityrather than just an instance of its supertype,Normalization, it can be used more generally. For example,Uniformitys allow you to theExplicitlyDSL withTripleEquals, whereasNormalizations requireTypeCheckedTripleEqualsorConversionCheckedTripleEquals.Uniformitys also enable you to use theExplicitlyDSL with ScalaTest'sshould===,equal, andcontainmatcher syntax, whereas a plainNormalizationcan only be used withshould===, and only under eitherTypeCheckedTripleEqualsorConversionCheckedTripleEquals.the type whose uniformity is being defined