Asking your input - Interactive Extensions functionality RRS feed

  • General discussion

  • Hi everyone,

    As several of you have noticed, the latest releases of Rx no longer include Ix. Our plan is to detach Ix from Rx and offer it as a separate download going forward. In the meantime, we'd like to ask for your feedback. What parts of Ix are you particularly fond of? Any things you like or don't like?

    Rx/Ix team

    using (Microsoft.Sql.Cloud.DataProgrammability.Rx) { Signature.Emit("Bart De Smet"); }
    Tuesday, June 14, 2011 2:13 AM

All replies



    The most used Ix features for me:

    • Do and Run operators. I've forgotten how to write foreach loops (it's a joke, but close to truth). I like these 2 operators more than the loops.
    • When it comes (and it happens with increasing frequency) to functional-style programming, I can't imagine working without Publish, as well as the whole group of functional alternatives to c# operators: EnumerableEx.Using, .If, .Catch, etc.
    • EnumerableEx.Return(x) is a great alternative to Enumerable.Repeat(x, 1)
    • Concat

    From times to times .Generate, .Defer, .Zip are handy.

    I have rarely used numeric aggregation operators (Sum, Average, etc.), Replay and Retry (perhaps just haven't met appropriate cases), OnErrorResumeNext, xxxEnumerable versions of LINQ operators (CountEnumerable, etc).

    To summarize my likes, it's the ability to work with collections in functional style that attracts me in Ix.

    One thing I frequently miss from both LINQ and Ix is a group of set algebra operators working on keys. I mean that for Exclude I want to have a set of ExcludeByKey operators which use neither elements comparison, nore equality comparer, but simply take a key from each element, compare the keys and use that as the criterion for results filter. The most generic version of ExcludeByKey has the following signature:

    public static IEnumerable<TSourceExceptByKey<TSourceTExcludedTKey>(
    			this IEnumerable<TSource> source, IEnumerable<TExcluded> excluded,
    			Func<TSourceTKey> sourceKeySelector, Func<TExcludedTKey> excludedKeySelector);

    I have even written some of the operators, but haven't yet finished the post with the code.


    Looking forward to the new Ix build,

    Tuesday, June 14, 2011 3:28 AM
  • I'm pretty disappointed that the team didn't solicit input from developers BEFORE removing functionality. Even going so far as to delete the old packages from Nuget. 

    Do and Run are the two workhorse methods I use in a LOT of my code. I can quickly unroll large loops into a few lines of code that are much easier to understand. Other favorites include SelectMany, Memoize, Scan and Zip.

    Please try to release Ix as soon as possible! I've temporarily moved the old nupkgs onto our local network feed, but I would rather use packages from MS.

    Is there a chance that Ix will disappear completely? I certainly hope not!


    Tuesday, June 14, 2011 3:31 AM
  • By the way, the Ix was a separate download in NuGet. Why not bring it back to there in short time while fixing your build environment for Microsoft Download?
    Tuesday, June 14, 2011 3:40 AM
  • Hi Bart,

    The extensions I'm using the most are:

      Do / Materialize / DeMaterialize / Finally - For side effects, life-cycle and exception transformation

      Scan - For streaming aggregations

      Run - As an alternative to for-each


    For me, I like the fact Ix defines a common vocabulary for core operators that applies to pull sequences as well as observables, and allows common patterns to be expressed similarly in the two worlds.


    - Martin


    Tuesday, June 14, 2011 6:15 AM
  • I started to use l20.js that is bundled with RxJs. Although there are some other third-party libraries that provide linq-to-objects functionality in javascript, I started using the one from the Rx team for no better reason because it came bundled with RxJs and it does what I need it to do. I don't think anything official was ever announced by the Rx team about l20.js though, but I have found its functionality very useful. I did have to fix a few bugs though as I posted here From l20.js I use Enumerable.FromArray, Empty, ToArray, Where, Select, SelectMany, First, FirstOrDefault, Last, LastOrDefault, Single, SingleOrDefault, ForEach, Take, Skip. Basic stuff but it's good to have it in javascript.



    Tuesday, June 14, 2011 8:28 AM
  • Hi Bart,


    Do, MinBy, MaxBy are quite handy from time to time.

    I'd prefer to have them distributed along with Rx or included into Enumerable in .NET 4.5.



    Tuesday, June 14, 2011 9:53 AM
  • Hi.

    I used following methods.
    Anything is indispensable to my program.
    • EnumerableEx.Return/EnumerableEx.Repeat/EnumerableEx.Concat
    • Do/Scan/BufferWithCount/SkipLast/TakeLast/Run

    Ix is beautiful, but have some not like points.

    • XxxEnumerable

    These interfered with IntelliSense.


    Are Ix in the future, the method names unified with Rx?

    Run -> ForEach
    BufferWithCount -> Buffer

    I think that I want you to unify it if you can do it.

    In addition, let me request only a little.
    • ForEach can use index overload like Select
    • Recursive/Traverse tree method(like Rx's Expand)


    I look forward to development.

    Yoshifumi Kawai / neuecc

    Tuesday, June 14, 2011 5:46 PM
  • Don't worry.  Ix is not disappearing forever.
    Tuesday, June 14, 2011 6:39 PM
  • Is there a particular reason why Ix should be removed from Rx? I thought that maintaining duality between the two was important, but perhaps it's not so important if you can convert any IEnumerable to/from an IObservable.  Honestly, I don't find myself using Ix for very much, but the extensions are nice to have when you want them.  Usually, however, I do everything with Rx and only convert to IEnumerable if I really, really need to.  I delay it as long as possible, because I want to think asynchronously.  After all, is there anything that the synchronous dual can do that the asynchronous cannot?  Certainly there are things the asynchronous dual can do which the synchronous dual cannot, which makes it more powerful.  Now after considering it further, why have IEnumerable at all, aside from backwards compatibility?


    Tuesday, June 14, 2011 6:40 PM
  • Like A Sherwook, I was blown away that you went so far as to remove the package from the NuGet feed. The release announcement said nothing of butchering the current infrastructure and projects. If you planned on yanking Ix out, wait until you have a working resolution to offer. Seeing the package yanked and no replacement is a slap in the face.

    There is nothing like get a report from a user that my build is broken for one of my open source projects, then having to search twitter for an answer as to where the packages I was using went only to find this thread.



    Tuesday, June 14, 2011 8:01 PM
  • I was looking to try out IAsyncEnumerable but didn't find it. I assume it was part of Ix. So I too am anxious to see it come back ASAP.

    Tuesday, June 14, 2011 8:33 PM
  • We recently went through our codebase to remove calls to Ix (so we could start using the new Rx release).

    Here are the methods we used (ordered from most popular to to least popular):

    - Run

    - IsEmpty

    - Return

    - Do

    - MinBy/MaxBy

    - MemoizeAll

    - SkipLast/TakeLast

    - Concat

    - Defer

    - BufferWithCount


    Wednesday, June 15, 2011 9:00 PM
  • While we sort out what parts of Ix we want to keep around, could you please re-publish the Rx-Interactive package to the Nuget gallery?

    Regards - Jordan

    Monday, June 20, 2011 3:04 PM
  • I second that!
    Thursday, June 23, 2011 10:16 AM
  • Thanks for the input. I'm happy to announce that Ix is now back as a separate download: Interactive Extensions v1.1.10621 Experimental Release. If you're using NuGet, search for packages with the Ix_Experimental prefix.

    We've focused on restoring the functionality most people care about, eliminated a number of operators that we weren't that fond of (e.g. the *Enumerable aggregates), restored parity with Rx where appropriate, and added support for IQueryable<T> through the QueryableEx type in System.Interactive.Providers. In addition, there are more and better XML doc comments.

    Let us know what you think and thanks for being patient!

    using (Microsoft.Sql.Cloud.DataProgrammability.Rx) { Signature.Emit("Bart De Smet"); }
    Wednesday, June 29, 2011 6:10 PM