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 🙏

© 2026 – Pkg Stats / Ryan Hefner

redux-reorder

v0.0.3

Published

Higher-order reducer that tracks order fluctuation within iterable state

Downloads

29

Readme

redux-reorder

Higher-order reducer that tracks order fluctuation within iterable state

npm version Build Status

The Problem

You have a reducer that holds on to iterable state. Its order periodically updates.

You would like to know how the order has changed relative to a previous order.

This package appends a given reducer with a representation of how its new order has changed from a previous order.

A use case

Showing the evolution of a leaderboard.

Let's say your application monitors the (daily) exchange rates of cryptocurrencies. A useful thing. Occasionally, one currency jumps ahead in value of another, and your state changes to reflect this.

You now want to show the extent of this change in your UI.

The implementation

Reducer wrapping

./reducers/index.js

import { combineReducers } from 'redux'
import grokReorders from 'redux-reorder'

import currencies from './currencies'

export default combineReducers({
  ...otherReducers,
  // We'll pass a reducer that manages iterable state to grokReorders.
  // It takes a config object as the second argument, where the number of calls
  // (= step) to the reducer initiated by a specified action type (= reorderType)
  // required before fluctuation is recalculated can be specificed.
  currencies: grokReorders(currencies, { step: 1, reorderType: 'RECEIVE_CURRENCIES' })
  // state.currencies will now look like: { iterable: <Iterable>, fluctuationMap: <Array> }
})

Connecting to React

./components/Leaderboard.js

import React, { Component } from 'react'
import { connect } from 'react-redux'

// A component which we imagine can display the order delta for a given item in a list.
import FluctuationIcon from './FluctuationIcon'

class Leaderboard extends Component {
  render() {
    // Recall that grokReorders changes the shape of the reducer it accepts as
    // an argument.

    // Now, with currencies.iterable we have access to the iterable as
    // originally returned by the reducer that was passed to grokReorders. With
    // currencies.fluctuationMap we have an array of integers which 'say' how 'far'
    // each element has moved from its last 'known' position.

    // For example, if currencies.fluctuationMap looks like [-1,1,0,0], then the
    // first element in currencies.iterable has moved 'up' one index from where it
    // last was, the second has moved 'down' one index, and so forth.
    const { currencies: { iterable, fluctuationMap } } = this.props
    return (
      <div>
        {iterable.map(({ name, valueInUSD }, i) => (
          <div>
            // We can now pass the appropriate indication of fluctuation to our
            // icon component.
            <FluctuationIcon delta={fluctuationMap[i]} />
            <p>{name}: {valueInUSD}</p>
          </div>
        ))}
      </div>
    )
  }
}

function mapStateToProps(state) {
  return {
    currencies: state => state.currencies
  }
}

// Inject the part of state we care about as a prop in Leaderboard.
export default connect(mapStateToProps)(Leaderboard)

Installation

npm i -S redux-reorder

or

yarn add redux-reorder