When using Source.fromFutureSource a single Future is re-used for every materialisation. A common usecase for this is doing an async action to initialise a Source e.g. hitting a database to get some initial state. A version that takes a () => Future[Source] would be more useful in these cases that would behave more like a Task than a Future
fromSourceCompletionStage too
lazilyAsync has such a type signature:
def lazilyAsync[T](create: () ⇒ Future[T]): Source[T, Future[NotUsed]]
Well almost. It would have to be combined with .flatMapConcat:
Source.lazilyAsync(() => Future.successful(Source.single(1))
.flatMapConcat(identity)
Another alternative would be lazily(() => Source.fromFutureSource(...))
Most helpful comment
Another alternative would be
lazily(() => Source.fromFutureSource(...))