Skip to content

Commit 4b0a87b

Browse files
committed
Add Syntax For Enumerable
Also load the existing definitions PartialNext/PartialPrevious into implicit scope.
1 parent 51156ef commit 4b0a87b

File tree

3 files changed

+152
-0
lines changed

3 files changed

+152
-0
lines changed

core/src/main/scala/cats/syntax/all.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ abstract class AllSyntaxBinCompat
3232
with AllSyntaxBinCompat5
3333
with AllSyntaxBinCompat6
3434
with AllSyntaxBinCompat7
35+
with AllSyntaxBinCompat8
3536

3637
trait AllSyntax
3738
extends AlternativeSyntax
@@ -122,3 +123,10 @@ trait AllSyntaxBinCompat5 extends ParallelBitraverseSyntax
122123
trait AllSyntaxBinCompat6 extends ParallelUnorderedTraverseSyntax
123124

124125
trait AllSyntaxBinCompat7 extends SeqSyntax
126+
127+
trait AllSyntaxBinCompat8
128+
extends PartialNextSyntax
129+
with NextSyntax
130+
with PartialPreviousSyntax
131+
with PreviousSyntax
132+
with BoundedEnumerableSyntax
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
* Copyright (c) 2015 Typelevel
3+
*
4+
* Permission is hereby granted, free of charge, to any person obtaining a copy of
5+
* this software and associated documentation files (the "Software"), to deal in
6+
* the Software without restriction, including without limitation the rights to
7+
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
8+
* the Software, and to permit persons to whom the Software is furnished to do so,
9+
* subject to the following conditions:
10+
*
11+
* The above copyright notice and this permission notice shall be included in all
12+
* copies or substantial portions of the Software.
13+
*
14+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
16+
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
17+
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
18+
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19+
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20+
*/
21+
22+
package cats
23+
package syntax
24+
25+
import cats.kernel._
26+
27+
trait PartialNextSyntax {
28+
implicit final def catsSyntaxPartialNext[A](a: A): PartialNextOps[A] =
29+
new PartialNextOps(a)
30+
}
31+
32+
final class PartialNextOps[A](private val lhs: A) extends AnyVal {
33+
def partialNext(implicit A: PartialNext[A]): Option[A] =
34+
A.partialNext(lhs)
35+
}
36+
37+
trait NextSyntax extends PartialNextSyntax {
38+
implicit final def catsSyntaxNext[A](a: A): NextOps[A] =
39+
new NextOps(a)
40+
}
41+
42+
final class NextOps[A](private val lhs: A) extends AnyVal {
43+
def next(implicit A: Next[A]): A =
44+
A.next(lhs)
45+
}
46+
47+
trait PartialPreviousSyntax {
48+
implicit final def catsSyntaxPartialPrevious[A](a: A): PartialPreviousOps[A] =
49+
new PartialPreviousOps(a)
50+
}
51+
52+
final class PartialPreviousOps[A](private val lhs: A) extends AnyVal {
53+
def partialPrevious(implicit A: PartialPrevious[A]): Option[A] =
54+
A.partialPrevious(lhs)
55+
}
56+
57+
trait PreviousSyntax extends PartialPreviousSyntax {
58+
implicit final def catsSyntaxPrevious[A](a: A): PreviousOps[A] =
59+
new PreviousOps(a)
60+
}
61+
62+
final class PreviousOps[A](private val lhs: A) extends AnyVal {
63+
def previous(implicit A: Previous[A]): A =
64+
A.previous(lhs)
65+
}
66+
67+
trait BoundedEnumerableSyntax extends NextSyntax with PreviousSyntax {
68+
implicit final def catsSyntaxForBoundedEnumerable[A](a: A): BoundedEnumerableOps[A] =
69+
new BoundedEnumerableOps(a)
70+
}
71+
72+
final class BoundedEnumerableOps[A](private val lhs: A) extends AnyVal {
73+
def cycleNext(implicit A0: PartialNext[A], A1: LowerBounded[A]): A =
74+
A0.partialNext(lhs).getOrElse(A1.minBound)
75+
76+
def cyclePrevious(implicit A0: PartialPrevious[A], A1: UpperBounded[A]): A =
77+
A0.partialPrevious(lhs).getOrElse(A1.maxBound)
78+
}

kernel/src/main/scala/cats/kernel/Enumerable.scala

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,29 @@ trait PartialNext[@sp A] {
3333
def partialNext(a: A): Option[A]
3434
}
3535

36+
object PartialNext {
37+
38+
def apply[A](implicit A: PartialNext[A]): PartialNext[A] =
39+
A
40+
41+
implicit def catsKernelPartialNextForUnit: PartialNext[Unit] =
42+
cats.kernel.instances.unit.catsKernelStdOrderForUnit
43+
implicit def catsKernelPartialNextForBoolean: PartialNext[Boolean] =
44+
cats.kernel.instances.boolean.catsKernelStdOrderForBoolean
45+
implicit def catsKernelPartialNextForByte: PartialNext[Byte] =
46+
cats.kernel.instances.byte.catsKernelStdOrderForByte
47+
implicit def catsKernelPartialNextForInt: PartialNext[Int] =
48+
cats.kernel.instances.int.catsKernelStdOrderForInt
49+
implicit def catsKernelPartialNextForShort: PartialNext[Short] =
50+
cats.kernel.instances.short.catsKernelStdOrderForShort
51+
implicit def catsKernelPartialNextForLong: PartialNext[Long] =
52+
cats.kernel.instances.long.catsKernelStdOrderForLong
53+
implicit def catsKernelPartialNextForChar: PartialNext[Char] =
54+
cats.kernel.instances.char.catsKernelStdOrderForChar
55+
implicit def catsKernelPartialNextForBigInt: PartialNext[BigInt] =
56+
cats.kernel.instances.bigInt.catsKernelStdOrderForBigInt
57+
}
58+
3659
/**
3760
* A typeclass with an operation which returns a member which is
3861
* always greater than the one supplied.
@@ -42,6 +65,14 @@ trait Next[@sp A] extends PartialNext[A] {
4265
override def partialNext(a: A): Option[A] = Some(next(a))
4366
}
4467

68+
object Next {
69+
def apply[A](implicit A: Next[A]): Next[A] =
70+
A
71+
72+
implicit def catsKernelNextForBigInt: Next[BigInt] =
73+
cats.kernel.instances.bigInt.catsKernelStdOrderForBigInt
74+
}
75+
4576
/**
4677
* A typeclass with an operation which returns a member which is
4778
* smaller or `None` than the one supplied.
@@ -51,6 +82,28 @@ trait PartialPrevious[@sp A] {
5182
def partialPrevious(a: A): Option[A]
5283
}
5384

85+
object PartialPrevious {
86+
def apply[A](implicit A: PartialPrevious[A]): PartialPrevious[A] =
87+
A
88+
89+
implicit def catsKernelPartialPreviousForUnit: PartialPrevious[Unit] =
90+
cats.kernel.instances.unit.catsKernelStdOrderForUnit
91+
implicit def catsKernelPartialPreviousForBoolean: PartialPrevious[Boolean] =
92+
cats.kernel.instances.boolean.catsKernelStdOrderForBoolean
93+
implicit def catsKernelPartialPreviousForByte: PartialPrevious[Byte] =
94+
cats.kernel.instances.byte.catsKernelStdOrderForByte
95+
implicit def catsKernelPartialPreviousForInt: PartialPrevious[Int] =
96+
cats.kernel.instances.int.catsKernelStdOrderForInt
97+
implicit def catsKernelPartialPreviousForShort: PartialPrevious[Short] =
98+
cats.kernel.instances.short.catsKernelStdOrderForShort
99+
implicit def catsKernelPartialPreviousForLong: PartialPrevious[Long] =
100+
cats.kernel.instances.long.catsKernelStdOrderForLong
101+
implicit def catsKernelPartialPreviousForChar: PartialPrevious[Char] =
102+
cats.kernel.instances.char.catsKernelStdOrderForChar
103+
implicit def catsKernelPartialPreviousForBigInt: PartialPrevious[BigInt] =
104+
cats.kernel.instances.bigInt.catsKernelStdOrderForBigInt
105+
}
106+
54107
/**
55108
* A typeclass with an operation which returns a member which is
56109
* always smaller than the one supplied.
@@ -61,6 +114,14 @@ trait Previous[@sp A] extends PartialPrevious[A] {
61114
override def partialPrevious(a: A): Option[A] = Some(previous(a))
62115
}
63116

117+
object Previous {
118+
def apply[A](implicit A: Previous[A]): Previous[A] =
119+
A
120+
121+
implicit def catsKernelPreviousForBigInt: Previous[BigInt] =
122+
cats.kernel.instances.bigInt.catsKernelStdOrderForBigInt
123+
}
124+
64125
/**
65126
* A typeclass which has both `previous` and `next` operations
66127
* such that `next . previous == identity`.
@@ -70,6 +131,11 @@ trait UnboundedEnumerable[@sp A] extends Next[A] with Previous[A] {
70131
override def partialOrder: PartialOrder[A] = order
71132
}
72133

134+
object UnboundedEnumerable {
135+
def apply[A](implicit A: UnboundedEnumerable[A]): UnboundedEnumerable[A] =
136+
A
137+
}
138+
73139
trait BoundedEnumerable[@sp A] extends PartialPreviousUpperBounded[A] with PartialNextLowerBounded[A] {
74140

75141
def order: Order[A]

0 commit comments

Comments
 (0)