Skip to content

Commit 81a8031

Browse files
committed
Add AtomicMapOptionOps
1 parent bb17b76 commit 81a8031

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed

std/shared/src/main/scala/cats/effect/std/AtomicMap.scala

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,44 @@ object AtomicMap {
8989
override def apply(key: K): AtomicCell[F, V] =
9090
AtomicCell.defaultedAtomicCell(atomicCell = atomicMap(key), default)
9191
}
92+
93+
implicit def atomicMapOptionSyntax[F[_], K, V](
94+
atomicMap: AtomicMap[F, K, Option[V]]
95+
)(
96+
implicit F: Applicative[F]
97+
): AtomicMapOptionOps[F, K, V] =
98+
new AtomicMapOptionOps(atomicMap)
99+
100+
final class AtomicMapOptionOps[F[_], K, V] private[effect] (
101+
atomicMap: AtomicMap[F, K, Option[V]]
102+
)(
103+
implicit F: Applicative[F]
104+
) {
105+
def getOrElse(key: K, default: V): F[V] =
106+
atomicMap(key).getOrElse(default)
107+
108+
def unsetKey(key: K): F[Unit] =
109+
atomicMap(key).unset
110+
111+
def setValue(key: K, value: V): F[Unit] =
112+
atomicMap(key).setValue(value)
113+
114+
def modifyValueIfSet[B](key: K)(f: V => (V, B)): F[Option[B]] =
115+
atomicMap(key).modifyValueIfSet(f)
116+
117+
def evalModifyValueIfSet[B](key: K)(f: V => F[(V, B)]): F[Option[B]] =
118+
atomicMap(key).evalModifyValueIfSet(f)
119+
120+
def updateValueIfSet(key: K)(f: V => V): F[Unit] =
121+
atomicMap(key).updateValueIfSet(f)
122+
123+
def evalUpdateValueIfSet(key: K)(f: V => F[V]): F[Unit] =
124+
atomicMap(key).evalUpdateValueIfSet(f)
125+
126+
def getAndSetValue(key: K, value: V): F[Option[V]] =
127+
atomicMap(key).getAndSetValue(value)
128+
129+
def withDefaultValue(default: V): AtomicMap[F, K, V] =
130+
defaultedAtomicMap(atomicMap, default)
131+
}
92132
}

0 commit comments

Comments
 (0)