- Support F# 5.0, thanks @cmeeren
- Optimized
Stream.keepPreceding*
andStream.keepFollowing1
. - Fix handling of
Task<T>
thrown Exceptions, thanks @hyprhare, @neoeinstein - Improve build process, thanks @wallymathieu
- Remove obsolete APIs, thanks @wallymathieu
- Fix memory leak in Alt.choice/alt/takers, thanks @TheAngryByrd for testing/verifying
- Upgrade from .Net 4.5 -> .Net 4.7.1, upgrade from netcoreapp1.1 -> netcoreapp2.0 where applicable, update package definition in ./run. Thanks @haf
- Update date ranges to 2018 in license and add "Open Source Contributors.", thanks @haf. (No other changes! ;))
- Enable ServerGC in examples, add note in a40ff5f, thanks @haf
- Added
idle
to yield the thread of execution. Thanks to @neoeinstein for the pull request!
- More robust detection against deadlocks caused by
run*
. - Scheduler changed to avoid running work recursively on non-worker threads.
- Optimized
Job.fromAsync
,Job.bindAsync
andJob.fromContinuations
in the case that the result is produced synchronously. - Added
Job.onThreadPool
to run a thunk onThreadPool
.
- Changed internal implementation of
Job.bind
,Job.map
,Alt.afterJob
andAlt.afterFun
to avoid potential space leaks. - Added
Hopac.runDelay
. - Fixed a space leak in a specific usage scenario of
Stream.switchMap
(and possiblyStream.switchAll
). The fix required a number of breaking changes to theStream
module signature, namelyStream.joinWith
,Stream.mapJoin
andStream.Builder
had to be changed, because it required eliminating some intermediate promise constructions. It is unlikely that these changes affect any users.
- Fixed a space leak that could be observed with programs running long periods of time with full worker utilization. Thanks to @vasily-kirichenko for reporting the issue!
- Minor optimizations to
Stream.afterEach
,Stream.duringEach
,Stream.ignoreWhile
andStream.shift
.
- Added
Stream.duringEach
.
- Eliminated undefined behaviour from
MVar.fill
,IVar.fill
andIVar.fillFailure
.
- Fixed dependencies in nupkg.
- Added preliminary .NET Core support. Big thanks to @haf, @ncave and @enricosada!
- Added an optimized applicative combinator
Job.apply
.
- Added stack to deadlock warning (thanks to Michael Newton).
- Optimized
MVar.read
,MVar.mutateFun
,MVar.modifyFun
,MVar.tryMutateFun
andMVar.tryModifyFun
.
- Added
MVar.mutateFun
,MVar.mutateJob
,MVar.tryMutateFun
,MVar.tryMutateJob
,MVar.tryModifyFun
, andMVar.tryModifyJob
.
- Changed interop primitives to avoid building up stack space in case interop resumes synchronously on a worker thread.
JobBuilder.Delay
was changed to be the identity function,JobBuilder.Run
was introduced to performJob.delay
,EmbeddedJobBuilder.Run
was also changed to take aunit -> Job<_>
,JobBuilder.Combine
,JobBuilder.TryFinally
,JobBuilder.TryWith
andJobBuilder.While
now take aunit -> Job<_>
rather than aJob<_>
.
These potentially breaking changes make it so that the ... ; ...
,
try-finally
, try-with
and while
constructs of job
avoid a separate
Job.delay
wrapper and perform better.
- Added
Stream.mapPipelinedFun
andStream.mapPipelinedJob
. - Added
Job.liftTask
andJob.liftUnitTask
.
- Added
Job.useIn
, a flipped version ofJob.using
, and optimized both.
- Added
Job.fromContinuations
.
- Faster
Job.fromAsync
. - Added
Job.bindAsync
.
- Fixed
FSharp.Core ~> 3
dependency once again. :(
- Added
Hopac.startAsTask
andHopac.queueAsTask
for interop with tasks.
- Added
Job.toAsync
and markedAsync.ofJobOn
andAsync.Global.ofJob
as obsolete. - Added
Alt.toAsync
. - Renamed the
TopLevel
module toHopac
. This rename is part of eliminating the scheduler concept and was made so that one can refer to e.gHopac.run
making it obvious where the functionality is coming from. - Marked the
Job.Global
module as obsolete. TheHopac
module is the new home for the same functionality. - Marked
Job.startWithFinalizer
as obsolete. Use theProc
abstraction instead. - Marked the
Timer
module for removal. Use theHopac
module. - Moved
Ch.Global.send -> Ch.Now.send
andMailbox.Global.send -> Mailbox.Now.send
. This is part of eliminating the scheduler concept. - Marked
*.create
functions obsolete where a constructor will do the job. Originally constructors were treated quite differently from other functions in F#. Today the differences are smaller and not enough to justify duplication.
- Marked
Async.toJobOn
andAsync.toAltOn
as obsolete.
- Introduced new optimized primitives for
Task
,Async
andBegin-End
interop (see reference), obsoleting interop primitivesAsync.toJob
,Async.toAlt
,Task.awaitJob
, andTask.bindJob
. - Deprecated
JobBuilder.Bind
andJobBuilder.ReturnFrom
overloads with non-genericTask
as argument, because they cause type-inference problems.
- Improved structure and formatting of the reference manual.
- Changed internal stack limit setting mechanism for trampolining.
- Potentially breaking change:
Stream.Builder.Plus
method was renamed intoStream.Builder.Combine
. - Added
Stream.tryPickJob
andStream.tryPickFun
. - Fixed
Job.using
to not raise in case given disposable reference isnull
.
- Dropped obsolete definitions.
- Exception handling fixes to
<*>
. - Allow null in
Job.using
for the disposable. - Fixed
Stream.Src
ops to be atomic. - Added various missing operators for symmetry.
- Added
IVar.tryFillFailure
.
- New package Hopac-StrongName for those requiring it.
- Added
*<+=>-
and*<+=>=
for async calls. - Reverted
FSharp.Core
dependency.
- Fixed lack of tail call workaround in
for
andwhile
.
- XML documentation was missing from
0.1.0
. - Updated
FSharp.Core
dependency to4.0.0.1
. - Redesigned infix operator symbols to allow most common expressions to be written without parentheses and also added several new infix operators. See the documentation for details.
- Moved all infix operators to the
Hopac.Infixes
module so that one only has to open one module to use infix operators. - Introduced
Alt.prepare*
andAlt.after*
combinators for clarity and uniformity to replacedelay
,guard
andwrap
. - Added
Job.isolate
as a workaround for scheduling issues. - Minor additions:
Seq.foldFromJob
,Proc.bind
,Proc.map
.
- Redesigned infix operator symbols to allow most common expressions to be written without parentheses and also added several new infix operators. See the documentation for details.
- Moved all infix operators to the
Hopac.Infixes
module so that one only has to open one module to use infix operators. - Introduced
Alt.prepare*
andAlt.after*
combinators for clarity and uniformity to replacedelay
,guard
andwrap
. - Added
Job.isolate
as a workaround for scheduling issues. - Minor additions:
Seq.foldFromJob
,Proc.bind
,Proc.map
.
- Fixed a bug in exception propagation of delayed promises.
- Fixed a bug in counting the number of active worker threads, which is only
used by
Scheduler.wait
.
- Changed to use
FSharp.Core
from NuGet. - Removed PCL profiles.
- Fixed potential leak with
Job.tryIn
andJob.tryInDelay
.
- Added basic
Stream.buffer
combinator. - Renamed
Stream.subscribe*
toStream.consume*
to better describe semantics. - Doc refinements.
- Added
Stream.pullOn
,Stream.skipWhileJob
,Stream.skipWhileFun
,Stream.pullOn
,Stream.foldBack
,Stream.mapIgnore
,Stream.ambAll
,Stream.appendAll
,Stream.mergeAll
andStream.switchAll
- Fixed to start reading the serialized variable immediately as documented.
- Added
Stream.subscribe*
as a shorthand forStream.iter* |> queue
. - Added mutable
Stream.Property<'x>
that generates property change notifications for e.g. WPF data binding. - Added
doFinalizeJob
anddoFinalizeFun
. - Experimental wrapper for streams that tracks space safety via phantom types.
- Changed
groupByJob
andgroupByFun
to take an additional function/job for forming new groups. - Added
Stream.tailsMapFun
andStream.initsMapFun
these are useful for lifting theStream.tails
andStream.inits
functions. - Added
keepFollowing1
and renamedkeepLatest
tokeepPreceding
to make the naming more symmetric although the concepts of "following" and "preceding" aren't really fully symmetric (unless you allow time travel). - A slightly more performant implementation of
keepLatestFuns
. - Renamed from
lazify
tokeepLatest
. - Lazification of live streams.
- Rethinking timing and throttling operations.
- Generalized
joinWith
andmapJoin
. - There is no sleep, only
timeOut
. - Added ability to directly bind observables in job computation expressions.
- Removed superfluous methods from
Async.OnWithSchedulerBuilder
.
- Fixed to properly remove waiter in case it timed out rather than was signalled.
- Signal when top timed changes to improve timer accuracy.
- Add a test of the job computation builder.
- Remove redundant builder methods.
- Added
Job.tryFinallyFunDelay
,Job.tryFinallyJobDelay
,Job.tryWithDelay
andJob.whileDoDelay
. - Added
Stream.mapConst
. - Removed
Stream.subscribeOnFirst
,Stream.subscribeDuring
andStream.subscribingTo
, becauseStream.ofObservable
easily covers all of those use cases.
- Scale work sharing by the number of cores.
- Distribute work more eagerly.
- Name worker threads.
- Added monadic composition operator
>=>
for jobs. - Updated documentation.
- Tuning streams.
- Tweaked Promisesc.
- Starting to benchmark streams.
- Avoid an allocation when choosing over lazy promises.
- Added
Stream.ofObservableOnMain
. - Added
Async.getMain
. - Added
Stream.ofObservableOn
andStream.ofObservable
. - Added
IObservable<_>.onceAlt
. - Renamed
withNack
aswithNackJob
andwrapAbort
aswrapAbortJob
. - Added
Alt.wrapAbortFun
. - Added
Alt.choosy
, which is an optimized version ofAlt.choose
for arrays. - Added
Job.Scheduler.bind
for wrapping external asynchronous events. - Added
Alt.withNackFun
. - Inlineable
withNack
avoids closure allocation. - Added experimental support for running async comptations on the main synchronization context, which must be explicitly configured by application code.
- Added
IObservable<'x>.onceAltOn
extension method for conveniently interfacing Hopac with suitable observables. - Added
TopLevel.startDelay
andTopLevel.queueDelay
for convenience. - Renamed
Builder.Join
toBuilder.Plus
and recognized that `Zero´ must also be abstract.
- Make sure
StaticData
is initialized, fix for #52. - Don't capture context, fix for #53.
- Added
Promise.Now.never
. - Optimized anonymous class initialization patterns: small time and space improvement across the board.
- Another MissingMethodException workaround.
- Changed the priority queue to a simple leftist heap and added some extra logic to purge abandoned timeouts while merging. See #50.
- Added
TopLevel.memo
as an alias forPromise.Now.delay
. - Added
Stream.takeAndSkipUntil
. - Disable inlining of
Latch.Now.create
as an attempt to work around aMissingMethodException
. - Fixing
combineLatest
to properly discard unmatched elements. - Add more reference implementations to the docs.
- Renamed
Stream.switchOn
toStream.switchTo
. - Make
Job.lift
inlineable.
- Added internal class for
for
-style jobs. - Added
Job.tryInDelay
. - Added
distinctUntilChanged
. - Extended
groupByFun
andgroupByJob
with ability to close substreams. - Added plain
iter
. - Tests for streams.
- Shift is tricky to implement correctly.
- Documenting and refining streams.
sleep
doesn't exist anymore.- Note about timeouts and liveness.
- Move Streams, BoundedMb and some functions form Hopac.Extra library to Hopac.
- Documenting and refining choice streams.
- Put
Streams
underTopLevel
. - Expose
Stream<'x>
atHopac
namespace level. - Experimental streams builder.
- Refining streams.
- Lazy memoizing promise operators.
- Fixed missing init in IVar and Nack.
- Merge Hopac.Extra package.
- Renamed
Streams.finallyFun
toStreams.onCloseFun
to emphasize semantic differences. - Added
Streams.subscribeDuring
. - Added
Streams.subscribe
to easily convert observables to streams. - Added
Streams.finallyJob
. - Added
Job.finallyFun
.
- Added
sleepMillis
andtimeOutMillis
. - Flexible typing.
select
andpick
are not necessary.- Added
Streams.scanFrom*
andStreams.foldFrom*
. - Reduced the synchronization properties of
StreamVar
andStreamSrc
. - Added
Alt.raises
andStreams.error
. - Added experimental
IAsyncDisposable
interface and associatedJob.usingAsync
combinator. - Added
Streams.tails
. - Added
Alt.Ignore
. - Generalized
MVar.modifyFun
andMVar.modifyJob
to alternatives.
- Fixed to refer to Xamarin.iOS rather than MonoTouch.
- Removed ThreadPool and WaitHandle extension methods, because they are not supported on PCL profiles.
- Removed Scheduler ThreadPriority option, because ThreadPriority is not supported on PCL profiles.
- Reorganized to PCL and platform libraries.
- Added Async.toAltOn, Async.toAlt.
- Added Alt.tryFinallyFun, Alt.tryFinallyJob.
- Attempt to work around an inlining issue with Alt.never calls.
- Fixed bug in delayed promises as selective operations.
- Fixed a couple of (exception handling) cases where nacks were not triggered correctly.
- Added non-operator versions of bind, map and wrap for convenience.
- Reintroduced lazy promises.
- Enhanced timeOut to work with zero and infinite time spans.
- Added some more TopLevel combinators for convenience.
- Print warning on Mono when not using SGen.
- MonoAndroid
- MonoTouch
- Fixed not to rely on tail calls on Mono.
- Minor tweaks to make Hopac work more nicely on Mono 3.6.0+.
- Switched to .Net framework 4.5 (was 4.5.1).
- Removed For array overload to avoid typing issue.
Array.iterJob
should now be used in performance critical cases. - Added experimental Async <-> Job interop support.
- Renamed
<|>
to<|>?
and added<|>
with result type restricted toJob
. - IVar is now inherited from Promise and both now have low level polling ops.
- Fixed bug in
Ch.Try.give
introduced in previous version.