rdfjs / stream-spec

RDF/JS: Stream interfaces – A specification of a low level interface definition representing RDF data independent of a serialized format in a JavaScript environment.
https://rdf.js.org/stream-spec/
5 stars 2 forks source link

Remove type constraint on Stream/Sink/Store type variable #14

Open dwhitney opened 5 years ago

dwhitney commented 5 years ago

Hey everyone,

In the Typescript type definition there is a type constraint on all of the Stream-spec types of Q extends BaseQuad = Quad. I propose removing this constraint. With the constraint in place, the data structure is pretty useless. By removing the constraint one can define Functor, Applicative, Traversable, Monad, etc., instances for Stream, which will give you functionality like map, chain/flatMap, filter, fold, traverse, sequence, etc. for free!

The reason this can't be done with the constraint in place is a the definition of map, for example, must allow the mapping from a general type A to a general type B inside of the Functor. Because Stream is constraining the type variable to Q extends BaseQuad, a general function mapping can't be applied and so Stream can't be treated as a Functor.

If it's desired to have a stream with the type variable fixed with Q extends BaseQuad = Quad, one could be provided out of the box, like

interface RDFStream<Q extends BaseQuad = Quad> extends Stream<Q> { 
...
}

or you could just let the user define one themselves.

Just to give an example of what could be done after the constraint is removed and the appropriate type class instances are implemented:

Thoughts?

dwhitney commented 5 years ago

looking closer at the types you could keep the type constraint on the Source type

elf-pavlik commented 5 years ago

RDFJS Stream interfaces now have dedicated repo and i transferred this issue to it. This looks relevant to #2

rubensworks commented 5 years ago

There is indeed definitely a need for using/creating a more generic stream interface (see #2), that is not tied to quads. Let's put this on hold until #2 is resolved. I can update the TS definitions afterwards.