@@ -668,6 +668,17 @@ sealed abstract private[data] class IRWSTInstances1 extends IRWSTInstances2 {
668668}
669669
670670sealed abstract private [data] class IRWSTInstances2 extends IRWSTInstances3 {
671+ implicit def catsDataNonEmptyAlternativeForIRWST [F [_], E , L , S ](implicit
672+ FM : Monad [F ],
673+ FA : NonEmptyAlternative [F ],
674+ L0 : Monoid [L ]
675+ ): NonEmptyAlternative [IndexedReaderWriterStateT [F , E , L , S , S , * ]] =
676+ new RWSTNonEmptyAlternative [F , E , L , S ] {
677+ implicit def G : NonEmptyAlternative [F ] = FA
678+ implicit def F : Monad [F ] = FM
679+ implicit def L : Monoid [L ] = L0
680+ }
681+
671682 implicit def catsDataAlternativeForIRWST [F [_], E , L , S ](implicit
672683 FM : Monad [F ],
673684 FA : Alternative [F ],
@@ -789,6 +800,10 @@ sealed abstract private[data] class RWSTMonad[F[_], E, L, S]
789800
790801sealed abstract private [data] class IRWSTSemigroupK [F [_], E , L , SA , SB ] extends IRWSTSemigroupK1 [F , E , L , SA , SB ]
791802
803+ sealed abstract private [data] class RWSTNonEmptyAlternative [F [_], E , L , S ]
804+ extends IRWSTFunctor [F , E , L , S , S ]
805+ with RWSTNonEmptyAlternative1 [F , E , L , S ]
806+
792807sealed abstract private [data] class RWSTAlternative [F [_], E , L , S ]
793808 extends IRWSTFunctor [F , E , L , S , S ]
794809 with RWSTAlternative1 [F , E , L , S ]
@@ -821,8 +836,54 @@ private trait IRWSTSemigroupK1[F[_], E, L, SA, SB] extends SemigroupK[IndexedRea
821836 }
822837}
823838
824- private trait RWSTAlternative1 [F [_], E , L , S ]
839+ private trait RWSTNonEmptyAlternative1 [F [_], E , L , S ]
825840 extends IRWSTSemigroupK1 [F , E , L , S , S ]
841+ with NonEmptyAlternative [ReaderWriterStateT [F , E , L , S , * ]] {
842+
843+ implicit def F : Monad [F ]
844+ def G : NonEmptyAlternative [F ]
845+ implicit def L : Monoid [L ]
846+
847+ // Enforces binary compatibility for RWSTAlternative1 between 2.6.1 and newer versions.
848+ final protected def pure0 [A ](a : A ): ReaderWriterStateT [F , E , L , S , A ] =
849+ ReaderWriterStateT .pure[F , E , L , S , A ](a)
850+
851+ // Enforces binary compatibility for RWSTAlternative1 between 2.6.1 and newer versions.
852+ final protected def ap0 [A , B ](
853+ ff : ReaderWriterStateT [F , E , L , S , A => B ]
854+ )(
855+ fa : ReaderWriterStateT [F , E , L , S , A ]
856+ ): ReaderWriterStateT [F , E , L , S , B ] =
857+ ff.flatMap(f => fa.map(f)(F ))(F , L )
858+
859+ def pure [A ](a : A ): ReaderWriterStateT [F , E , L , S , A ] = pure0(a)
860+
861+ def ap [A , B ](
862+ ff : ReaderWriterStateT [F , E , L , S , A => B ]
863+ )(
864+ fa : ReaderWriterStateT [F , E , L , S , A ]
865+ ): ReaderWriterStateT [F , E , L , S , B ] =
866+ ap0(ff)(fa)
867+
868+ override def prependK [A ](
869+ a : A ,
870+ fa : IndexedReaderWriterStateT [F , E , L , S , S , A ]
871+ ): IndexedReaderWriterStateT [F , E , L , S , S , A ] =
872+ IndexedReaderWriterStateT { (e, s) =>
873+ G .prependK((L .empty, s, a), fa.run(e, s))
874+ }
875+
876+ override def appendK [A ](
877+ fa : IndexedReaderWriterStateT [F , E , L , S , S , A ],
878+ a : A
879+ ): IndexedReaderWriterStateT [F , E , L , S , S , A ] =
880+ IndexedReaderWriterStateT { (e, s) =>
881+ G .appendK(fa.run(e, s), (L .empty, s, a))
882+ }
883+ }
884+
885+ private trait RWSTAlternative1 [F [_], E , L , S ]
886+ extends RWSTNonEmptyAlternative1 [F , E , L , S ]
826887 with Alternative [ReaderWriterStateT [F , E , L , S , * ]] {
827888
828889 implicit def F : Monad [F ]
@@ -831,11 +892,15 @@ private trait RWSTAlternative1[F[_], E, L, S]
831892
832893 def empty [A ]: ReaderWriterStateT [F , E , L , S , A ] = ReaderWriterStateT .liftF(G .empty[A ])
833894
834- def pure [A ](a : A ): ReaderWriterStateT [F , E , L , S , A ] = ReaderWriterStateT .pure[F , E , L , S , A ](a)
895+ // Must exist in this trait for binary compatibility.
896+ override def pure [A ](a : A ): ReaderWriterStateT [F , E , L , S , A ] =
897+ pure0(a)
835898
836- def ap [A , B ](
899+ // Must exist in this trait for binary compatibility.
900+ override def ap [A , B ](
837901 ff : ReaderWriterStateT [F , E , L , S , A => B ]
838- )(fa : ReaderWriterStateT [F , E , L , S , A ]): ReaderWriterStateT [F , E , L , S , B ] =
839- ff.flatMap(f => fa.map(f)(F ))(F , L )
840-
902+ )(
903+ fa : ReaderWriterStateT [F , E , L , S , A ]
904+ ): ReaderWriterStateT [F , E , L , S , B ] =
905+ ap0(ff)(fa)
841906}
0 commit comments