@@ -27,6 +27,43 @@ class ApplicativeErrorSuite extends CatsSuite {
2727 failed.attemptT should === (EitherT [Option , Unit , Int ](Option (Left (()))))
2828 }
2929
30+ test(" attemptNarrow[EE] syntax creates an F[Either[EE, A]]" ) {
31+ trait Err
32+ case class ErrA () extends Err
33+ case class ErrB () extends Err
34+
35+ implicit val eqForErr : Eq [Err ] = Eq .fromUniversalEquals[Err ]
36+ implicit val eqForErrA : Eq [ErrA ] = Eq .fromUniversalEquals[ErrA ]
37+ implicit val eqForErrB : Eq [ErrB ] = Eq .fromUniversalEquals[ErrB ]
38+
39+ val failed : Either [Err , Int ] = ErrA ().raiseError[Either [Err , * ], Int ]
40+
41+ failed.attemptNarrow[ErrA ] should === (ErrA ().asLeft[Int ].asRight[Err ])
42+ failed.attemptNarrow[ErrB ] should === (Either .left[Err , Either [ErrB , Int ]](ErrA ()))
43+ }
44+
45+ test(" attemptNarrow works for parametrized types" ) {
46+ trait T [A ]
47+ case object Str extends T [String ]
48+ case class Num (i : Int ) extends T [Int ]
49+
50+ implicit def eqForT [A ]: Eq [T [A ]] = Eq .fromUniversalEquals[T [A ]]
51+ implicit val eqForStr : Eq [Str .type ] = Eq .fromUniversalEquals[Str .type ]
52+ implicit val eqForNum : Eq [Num ] = Eq .fromUniversalEquals[Num ]
53+
54+ val e : Either [T [Int ], Unit ] = Num (1 ).asLeft[Unit ]
55+ e.attemptNarrow[Num ] should === (e.asRight[T [Int ]])
56+ assertTypeError(" e.attemptNarrow[Str.type]" )
57+
58+ val e2 : Either [T [String ], Unit ] = Str .asLeft[Unit ]
59+ e2.attemptNarrow[Str .type ] should === (e2.asRight[T [String ]])
60+ assertTypeError(" e2.attemptNarrow[Num]" )
61+
62+ val e3 : Either [List [T [String ]], Unit ] = List (Str ).asLeft[Unit ]
63+ e3.attemptNarrow[List [Str .type ]] should === (e3.asRight[List [T [String ]]])
64+ assertTypeError(" e3.attemptNarrow[List[Num]]" )
65+ }
66+
3067 test(" recover syntax transforms an error to a success" ) {
3168 failed.recover { case _ => 7 } should === (Some (7 ))
3269 }
0 commit comments