trait Signal[F[_], A] extends AnyRef
Pure holder of a single value of type A that can be read in the effect F.
- Source
- Signal.scala
- Alphabetic
- By Inheritance
- Signal
- AnyRef
- Any
- Hide All
- Show All
- Public
- All
Abstract Value Members
-
abstract
def
continuous: Stream[F, A]
Returns a stream of the current value of the signal.
Returns a stream of the current value of the signal. An element is always available -- on each pull, the current value is supplied.
-
abstract
def
discrete: Stream[F, A]
Returns a stream of the updates to this signal.
Returns a stream of the updates to this signal.
Even if you are pulling as fast as possible, updates that are very close together may result in only the last update appearing in the stream. In general, when you pull from this stream you may be notified of only the latest update since your last pull. If you want to be notified about every single update, use a
QueueorChannelinstead. -
abstract
def
get: F[A]
Asynchronously gets the current value of this
Signal.
Concrete Value Members
-
final
def
!=(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
##(): Int
- Definition Classes
- AnyRef → Any
-
final
def
==(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
final
def
asInstanceOf[T0]: T0
- Definition Classes
- Any
-
def
clone(): AnyRef
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()
-
final
def
eq(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
def
equals(arg0: Any): Boolean
- Definition Classes
- AnyRef → Any
-
def
finalize(): Unit
- Attributes
- protected[lang]
- Definition Classes
- AnyRef
- Annotations
- @throws( classOf[java.lang.Throwable] )
-
final
def
getClass(): Class[_]
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
def
hashCode(): Int
- Definition Classes
- AnyRef → Any
- Annotations
- @native()
-
final
def
isInstanceOf[T0]: Boolean
- Definition Classes
- Any
-
final
def
ne(arg0: AnyRef): Boolean
- Definition Classes
- AnyRef
-
final
def
notify(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
notifyAll(): Unit
- Definition Classes
- AnyRef
- Annotations
- @native()
-
final
def
synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
-
def
toString(): String
- Definition Classes
- AnyRef → Any
-
final
def
wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
-
final
def
wait(arg0: Long): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... ) @native()
-
def
waitUntil(p: (A) ⇒ Boolean)(implicit F: Concurrent[F]): F[Unit]
Returns when the condition becomes true, semantically blocking in the meantime.
Returns when the condition becomes true, semantically blocking in the meantime.
This method is particularly useful to transform naive, recursive polling algorithms on the content of a
Signal/SignallingRefinto semantically blocking ones. For example, here's how to encode a very simple cache with expiry, pay attention to the definition ofview:trait Refresh[F[_], A] { def get: F[A] } object Refresh { def create[F[_]: Temporal, A]( action: F[A], refreshAfter: A => FiniteDuration, defaultExpiry: FiniteDuration ): Resource[F, Refresh[F, A]] = Resource .eval(SignallingRef[F, Option[Either[Throwable, A]]](None)) .flatMap { state => def refresh: F[Unit] = state.set(None) >> action.attempt.flatMap { res => val t = res.map(refreshAfter).getOrElse(defaultExpiry) state.set(res.some) >> Temporal[F].sleep(t) >> refresh } def view = new Refresh[F, A] { def get: F[A] = state.get.flatMap { case Some(res) => Temporal[F].fromEither(res) case None => state.waitUntil(_.isDefined) >> get } } refresh.background.as(view) } }
Note that because
Signalprioritizes the latest update when its state is updating very quickly, completion of theF[Unit]might not trigger if the condition becomes true and then false immediately after.Therefore, natural use cases of
waitUntiltend to fall into two categories: - Scenarios where conditions don't change instantly, such as periodic timed processes updating theSignal/SignallingRef. - Scenarios where conditions might change instantly, but theppredicate is monotonic, i.e. if it tests true for an event, it will test true for the following events as well. Examples include waiting for a unique ID stored in aSignalto change, or waiting for the value of theSignalof an orderedStream[IO, Int]to be greater than a certain number.