Skip to content

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

@dwhitney

Description

@dwhitney

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:

  • fold over a Stream<Quad> to produce Either<Error, User>
  • traverse over a Stream<Quad> to produce Stream<User>
  • chain over a Stream<Quad> of a SHACL shapes, where owl:import statements are resolved and a new Stream<Quad> is produced, and then fold could be used to reduce some data structure representing a "Shape"

Thoughts?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions