staltz / xstream

An extremely intuitive, small, and fast functional reactive stream library for JavaScript
http://staltz.github.io/xstream/
MIT License
2.37k stars 137 forks source link

Distinctiveness of MemoryStream and Stream #306

Open wclr opened 4 years ago

wclr commented 4 years ago

Currently, MemoryStream and Stream has exactly the same API surface. Though MemoryStream is actually a descendant from Stream which is a more abstract case.

So, now:

// those are both valid cases
const stream: Stream<any> = xs.createWithMemory() // is valid
const memoryStream: MemoryStream<any> = xs.create() // is valid

Though it seems that the latter case would better be invalid in terms of type checking. If you expect MemoryStream you probably should not expect or want just Stream as an input.

Currently, I fix this:

declare module 'xstream' {
  interface MemoryStream<T> {
    // make MemoryStream distinctive from Stream
    __withMemory: true // this could be any prop, here
  }

But such distinction could be introduced in xstream by design. Maybe this issue could also relate to https://github.com/staltz/xstream/issues/304 which is runtime case for finding a distinction between types of streams.

mightyiam commented 4 years ago

@whitecolor by the way, perhaps distinctiveness could be more reliable using a symbol.