@@ -668,6 +668,17 @@ sealed abstract private[data] class IRWSTInstances1 extends IRWSTInstances2 {
668
668
}
669
669
670
670
sealed 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
+
671
682
implicit def catsDataAlternativeForIRWST [F [_], E , L , S ](implicit
672
683
FM : Monad [F ],
673
684
FA : Alternative [F ],
@@ -789,6 +800,10 @@ sealed abstract private[data] class RWSTMonad[F[_], E, L, S]
789
800
790
801
sealed abstract private [data] class IRWSTSemigroupK [F [_], E , L , SA , SB ] extends IRWSTSemigroupK1 [F , E , L , SA , SB ]
791
802
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
+
792
807
sealed abstract private [data] class RWSTAlternative [F [_], E , L , S ]
793
808
extends IRWSTFunctor [F , E , L , S , S ]
794
809
with RWSTAlternative1 [F , E , L , S ]
@@ -821,8 +836,54 @@ private trait IRWSTSemigroupK1[F[_], E, L, SA, SB] extends SemigroupK[IndexedRea
821
836
}
822
837
}
823
838
824
- private trait RWSTAlternative1 [F [_], E , L , S ]
839
+ private trait RWSTNonEmptyAlternative1 [F [_], E , L , S ]
825
840
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 ]
826
887
with Alternative [ReaderWriterStateT [F , E , L , S , * ]] {
827
888
828
889
implicit def F : Monad [F ]
@@ -831,11 +892,15 @@ private trait RWSTAlternative1[F[_], E, L, S]
831
892
832
893
def empty [A ]: ReaderWriterStateT [F , E , L , S , A ] = ReaderWriterStateT .liftF(G .empty[A ])
833
894
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)
835
898
836
- def ap [A , B ](
899
+ // Must exist in this trait for binary compatibility.
900
+ override def ap [A , B ](
837
901
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)
841
906
}
0 commit comments