npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@tangle/linear-append

v2.0.1

Published

a rough way to fake a linear ordering in a divergent context

Downloads

70

Readme

@tangle/linear-append

A strategy for tracking a set over time, when it matters when a certain thing was added to a Set, and when it was removed

Example Usage

This is mainly used with @tangle/strategy to compose higher order strategies, and @tangle/reduce to use it, but here's an example of using it stand alone

const LinearAppend = require('@tangle/linear-append')

const linearAppend = LinearAppend()

const input = [
  { key: [111, '@mix'], value: 'what shall we have for dinner?' },
  { key: [115, '@mix'], value: 'Keen, I would like one without onion plz' }
  { key: [112, '@ben'], value: 'PIZZA!' },
}

const T = linearAppend.mapFromInput(input)
// => {
//   '111@mix': 'what shall we have for dinner?',
//   '115@mix': 'Keen, I would like one without onion plz'
//   '112@ben': 'PIZZA!',
// }

The raw transformations look like this:

{
  [key]: value
}

where

  • key String - a unique key used to later determine ordering in linear output
    • NOTE the human input is provided as an Array so you can provide multiple inputs which helps for tie-breaking
  • value String - the value to be appended
linearAppend.mapToOutput(T)
// => [
//   'what shall we have for dinner?',
//   'PIZZA!',
//   'Keen, I would like one without onion plz'
// ]

API

LinearAppend(opts) => linearAppend

Instantiates a strategy, linearAppend.

opts Object is an optional object where you can specify:

  • keyPattern String (optional)
    • a JSON schema pattern string which is used to validate keys
    • Note that the Array of values in the human input is concatenated into a String key, and this is what is validated
    • e.g. '^@\w+$' would make only keys like @mixmix valid
    • default: '^.+$'
  • valueSchema Object (optional)
    • a JSON schema object used for validating the values passed in.
    • default: { type: 'string', required: true }

linearAppend.concat(A, B) => C

linearAppend.identity() => I

returns "identity transformation"

linearAppend.mapFromInput(input) => T

Takes a human friendly (descriptive) input and returns a transformation T which satisfies the change requested in `input.

Format of input:

[
  { key: OrderingKey, value: AppendValue },
  { key: OrderingKey, value: AppendValue },
  ...
]

where:

  • OrderingKey is an Array which will be concatenated and compared to other values for ordering
  • AppendValue is some value you want to append. Can be anything that passes your valueSchema

linearAppend.mapToOutput(T) => t

Takes a transformation T and returns an output state t, which is more "human readable"

Format of output t:

[
  AppendValue,
  AppendValue,
  ...
]

### `linearAppend.isValid(T) => Boolean`

### `linearAppend.schema`

Access the JSON schema that `isValid` was built with.

### `linearAppend.isConflict() => False`
### `linearAppend.isValidMerge() => True`
### `linearAppend.merge(graph, mergeNode, field) => T`
where:
- `graph` is a `@tangle/graph` instance
- `mergeNode` is the proposed merge-node
- `field` *String* contains the the data fields `node.data[field]`