/
string.scala
48 lines (40 loc) · 1.57 KB
/
string.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package eu.timepit.refined.scalacheck
import eu.timepit.refined.api.{Refined, RefType}
import eu.timepit.refined.collection.{NonEmpty, Size}
import eu.timepit.refined.string.{EndsWith, StartsWith, Trimmed}
import eu.timepit.refined.types.string.TrimmedString
import org.scalacheck.Arbitrary
import shapeless.Witness
/**
* Module that provides `Arbitrary` instances for `String` related
* predicates.
*/
object string extends StringInstances with StringInstancesBinCompat1
trait StringInstances {
implicit def endsWithArbitrary[F[_, _], S <: String](
implicit rt: RefType[F],
ws: Witness.Aux[S]
): Arbitrary[F[String, EndsWith[S]]] =
arbitraryRefType(Arbitrary.arbString.arbitrary.map(_ + ws.value))
implicit def startsWithArbitrary[F[_, _], S <: String](
implicit rt: RefType[F],
ws: Witness.Aux[S]
): Arbitrary[F[String, StartsWith[S]]] =
arbitraryRefType(Arbitrary.arbString.arbitrary.map(ws.value + _))
implicit def nonEmptyStringArbitrary[F[_, _]](
implicit rt: RefType[F]
): Arbitrary[F[String, NonEmpty]] =
collection.buildableNonEmptyArbitrary[F, String, Char]
implicit def stringSizeArbitrary[F[_, _]: RefType, P](
implicit
arbChar: Arbitrary[Char],
arbSize: Arbitrary[Int Refined P]
): Arbitrary[F[String, Size[P]]] =
collection.buildableSizeArbitrary[F, String, Char, P]
}
trait StringInstancesBinCompat1 {
implicit def trimmedStringArbitrary[F[_, _]](
implicit rt: RefType[F]
): Arbitrary[F[String, Trimmed]] =
arbitraryRefType(Arbitrary.arbString.arbitrary.map(TrimmedString.trim(_).value))
}