All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cps.runtime.MapAsyncShift.scala Maven / Gradle / Ivy

package cps.runtime

import cps._
import scala.collection._

class MapOpsAsyncShift[K,V, CC[KX,VX] <: MapOps[KX,VX,CC,CC[KX,VX]] & CI[(KX,VX)],
                            CI[X] <: Iterable[X] & IterableOps[X,CI,CI[X]],
                                                                 CKV <: CC[K,V] & PartialFunction[K,V] ] extends
                                                                       IterableOpsAsyncShift[(K,V),CI,CKV]
                                                                      with PartialFunctionAsyncShiftBase[K,V, CKV]
                                                                      with AsyncShift[CKV]:
                                                                      

 def flatMap[F[_], K2, V2](c: CKV, m: CpsMonad[F])(f: ((K, V)) => F[IterableOnce[(K2, V2)]]): F[CC[K2, V2]] =
   val s0 = m.pure(c.mapFactory.newBuilder[K2,V2])
   val it = c.foldLeft(s0){ (s,e) =>
      m.flatMap(s){ cc =>
         m.map(f(e._1,e._2)){ vs =>
           cc.addAll(vs)
         }
      }
   }
   m.map(it)(_.result)
   
 def map[F[_], K2, V2](c: CKV, m: CpsMonad[F])(f: ((K, V)) => F[(K2, V2)]): F[CC[K2, V2]] =
   val s0 = m.pure(c.mapFactory.newBuilder[K2,V2])
   val it = c.foldLeft(s0){ (s,e) =>
      m.flatMap(s){ cc =>
         m.map(f(e._1,e._2)){ vs =>
           cc.addOne(vs)
         }
      }
   }
   m.map(it)(_.result)


 def foreachEntry[F[_],U](c: CKV, m:CpsMonad[F])(f: (K, V) => F[U]): F[Unit] =
   foreach[F,U](c, m)(x => f(x._1, x._2) )

 def getOrElse[F[_],V1 >: V](c: CKV, m: CpsMonad[F])(key: K, default: () => F[V1]): F[V1] =
   c.get(key) match
     case Some(v) => m.pure(v)
     case None => default()
   


    





© 2015 - 2025 Weber Informatics LLC | Privacy Policy