Tail method implementation with DynamicData by Roland Pheasant
I try to figure out how to use DynamicData library. I need to make method that will handle changes of source and pass only last n changes. It could be named Tail(). There is method named Top() in package, it uses IVirtualRequest's. I have wrote example based on this functional:
public static class Extensions
{
public static IObservable<IChangeSet<T>> Tail<T>([NotNull] this IObservable<IChangeSet<T>> source,
int numberOfItems)
{
var request = new TailRequest<T>(source, numberOfItems);
return source.Virtualise(Observable.Return(request));
}
}
public class TailRequest<T> : IVirtualRequest, IDisposable
{
private readonly IDisposable subscription;
private int _count;
public int Size { get; }
public int StartIndex => _count > Size ? _count - Size : 0;
public TailRequest(IObservable<IChangeSet<T>> source, int numberOfItems)
{
//how to dispose this from outside???
subscription = source.Subscribe(RefreshStartIndex);
Size = numberOfItems;
}
private void RefreshStartIndex(IChangeSet<T> changeSet)
{
_count += changeSet.Adds;
_count -= changeSet.Removes;
}
public void Dispose()
{
subscription.Dispose();
}
}
But i can't understand how should i dispose this request from outside, if i use this method like:
SourceList<Message> sourceList = new SourceList<Message>();
var subscription = _sourceList.Connect()
.Tail(15)
.ObserveOn(RxApp.MainThreadScheduler)
.Bind(Messages)
.Subscribe();
I think subscription.Dispose() will not dispose my TailRequest.
Or is there a better solution?
c# system.reactive reactiveui
add a comment |
I try to figure out how to use DynamicData library. I need to make method that will handle changes of source and pass only last n changes. It could be named Tail(). There is method named Top() in package, it uses IVirtualRequest's. I have wrote example based on this functional:
public static class Extensions
{
public static IObservable<IChangeSet<T>> Tail<T>([NotNull] this IObservable<IChangeSet<T>> source,
int numberOfItems)
{
var request = new TailRequest<T>(source, numberOfItems);
return source.Virtualise(Observable.Return(request));
}
}
public class TailRequest<T> : IVirtualRequest, IDisposable
{
private readonly IDisposable subscription;
private int _count;
public int Size { get; }
public int StartIndex => _count > Size ? _count - Size : 0;
public TailRequest(IObservable<IChangeSet<T>> source, int numberOfItems)
{
//how to dispose this from outside???
subscription = source.Subscribe(RefreshStartIndex);
Size = numberOfItems;
}
private void RefreshStartIndex(IChangeSet<T> changeSet)
{
_count += changeSet.Adds;
_count -= changeSet.Removes;
}
public void Dispose()
{
subscription.Dispose();
}
}
But i can't understand how should i dispose this request from outside, if i use this method like:
SourceList<Message> sourceList = new SourceList<Message>();
var subscription = _sourceList.Connect()
.Tail(15)
.ObserveOn(RxApp.MainThreadScheduler)
.Bind(Messages)
.Subscribe();
I think subscription.Dispose() will not dispose my TailRequest.
Or is there a better solution?
c# system.reactive reactiveui
add a comment |
I try to figure out how to use DynamicData library. I need to make method that will handle changes of source and pass only last n changes. It could be named Tail(). There is method named Top() in package, it uses IVirtualRequest's. I have wrote example based on this functional:
public static class Extensions
{
public static IObservable<IChangeSet<T>> Tail<T>([NotNull] this IObservable<IChangeSet<T>> source,
int numberOfItems)
{
var request = new TailRequest<T>(source, numberOfItems);
return source.Virtualise(Observable.Return(request));
}
}
public class TailRequest<T> : IVirtualRequest, IDisposable
{
private readonly IDisposable subscription;
private int _count;
public int Size { get; }
public int StartIndex => _count > Size ? _count - Size : 0;
public TailRequest(IObservable<IChangeSet<T>> source, int numberOfItems)
{
//how to dispose this from outside???
subscription = source.Subscribe(RefreshStartIndex);
Size = numberOfItems;
}
private void RefreshStartIndex(IChangeSet<T> changeSet)
{
_count += changeSet.Adds;
_count -= changeSet.Removes;
}
public void Dispose()
{
subscription.Dispose();
}
}
But i can't understand how should i dispose this request from outside, if i use this method like:
SourceList<Message> sourceList = new SourceList<Message>();
var subscription = _sourceList.Connect()
.Tail(15)
.ObserveOn(RxApp.MainThreadScheduler)
.Bind(Messages)
.Subscribe();
I think subscription.Dispose() will not dispose my TailRequest.
Or is there a better solution?
c# system.reactive reactiveui
I try to figure out how to use DynamicData library. I need to make method that will handle changes of source and pass only last n changes. It could be named Tail(). There is method named Top() in package, it uses IVirtualRequest's. I have wrote example based on this functional:
public static class Extensions
{
public static IObservable<IChangeSet<T>> Tail<T>([NotNull] this IObservable<IChangeSet<T>> source,
int numberOfItems)
{
var request = new TailRequest<T>(source, numberOfItems);
return source.Virtualise(Observable.Return(request));
}
}
public class TailRequest<T> : IVirtualRequest, IDisposable
{
private readonly IDisposable subscription;
private int _count;
public int Size { get; }
public int StartIndex => _count > Size ? _count - Size : 0;
public TailRequest(IObservable<IChangeSet<T>> source, int numberOfItems)
{
//how to dispose this from outside???
subscription = source.Subscribe(RefreshStartIndex);
Size = numberOfItems;
}
private void RefreshStartIndex(IChangeSet<T> changeSet)
{
_count += changeSet.Adds;
_count -= changeSet.Removes;
}
public void Dispose()
{
subscription.Dispose();
}
}
But i can't understand how should i dispose this request from outside, if i use this method like:
SourceList<Message> sourceList = new SourceList<Message>();
var subscription = _sourceList.Connect()
.Tail(15)
.ObserveOn(RxApp.MainThreadScheduler)
.Bind(Messages)
.Subscribe();
I think subscription.Dispose() will not dispose my TailRequest.
Or is there a better solution?
c# system.reactive reactiveui
c# system.reactive reactiveui
edited Nov 15 '18 at 3:44
Gotcha
asked Nov 14 '18 at 9:59
GotchaGotcha
2514
2514
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
This will do the trick
public static IObservable<IChangeSet<T>> Tail<T>([NotNull] this IObservable<IChangeSet<T>> source, int numberOfItems)
{
return Observable.Create<IChangeSet<T>>(observer =>
{
var request = new TailRequest<T>(source, numberOfItems);
return new CompositeDisposable
(
request,
source.Virtualise(Observable.Return(request)).SubscribeSafe(observer)
);
});
The function inside Observable.Create returns a disposable which is used to clean up any resources created by the observable. When the consuming subscriber is disposed, the inner disposable created in the function is also disposed.
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53297454%2ftail-method-implementation-with-dynamicdata-by-roland-pheasant%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
This will do the trick
public static IObservable<IChangeSet<T>> Tail<T>([NotNull] this IObservable<IChangeSet<T>> source, int numberOfItems)
{
return Observable.Create<IChangeSet<T>>(observer =>
{
var request = new TailRequest<T>(source, numberOfItems);
return new CompositeDisposable
(
request,
source.Virtualise(Observable.Return(request)).SubscribeSafe(observer)
);
});
The function inside Observable.Create returns a disposable which is used to clean up any resources created by the observable. When the consuming subscriber is disposed, the inner disposable created in the function is also disposed.
add a comment |
This will do the trick
public static IObservable<IChangeSet<T>> Tail<T>([NotNull] this IObservable<IChangeSet<T>> source, int numberOfItems)
{
return Observable.Create<IChangeSet<T>>(observer =>
{
var request = new TailRequest<T>(source, numberOfItems);
return new CompositeDisposable
(
request,
source.Virtualise(Observable.Return(request)).SubscribeSafe(observer)
);
});
The function inside Observable.Create returns a disposable which is used to clean up any resources created by the observable. When the consuming subscriber is disposed, the inner disposable created in the function is also disposed.
add a comment |
This will do the trick
public static IObservable<IChangeSet<T>> Tail<T>([NotNull] this IObservable<IChangeSet<T>> source, int numberOfItems)
{
return Observable.Create<IChangeSet<T>>(observer =>
{
var request = new TailRequest<T>(source, numberOfItems);
return new CompositeDisposable
(
request,
source.Virtualise(Observable.Return(request)).SubscribeSafe(observer)
);
});
The function inside Observable.Create returns a disposable which is used to clean up any resources created by the observable. When the consuming subscriber is disposed, the inner disposable created in the function is also disposed.
This will do the trick
public static IObservable<IChangeSet<T>> Tail<T>([NotNull] this IObservable<IChangeSet<T>> source, int numberOfItems)
{
return Observable.Create<IChangeSet<T>>(observer =>
{
var request = new TailRequest<T>(source, numberOfItems);
return new CompositeDisposable
(
request,
source.Virtualise(Observable.Return(request)).SubscribeSafe(observer)
);
});
The function inside Observable.Create returns a disposable which is used to clean up any resources created by the observable. When the consuming subscriber is disposed, the inner disposable created in the function is also disposed.
answered Nov 14 '18 at 18:21
Roland PheasantRoland Pheasant
44644
44644
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53297454%2ftail-method-implementation-with-dynamicdata-by-roland-pheasant%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown