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

@cahmoraes93/simple-immuter

v3.2.1

Published

Pacote para trabalhar com imutabilidade e clonagem profunda de estruturas de dados

Downloads

19

Readme

:rocket: Sobre

Descrição

Desenvolvimento da biblioteca Simple Immuter.

Esse projeto surgiu por meio de uma motivação da biblioteca Immer. Ao longo das últimas semanas estive estudando a fundo o desenvolvimento de uma função de cloneDeep, capaz de realizar clonagem profunda de objetos e arrays. Tendo como inspiração a função cloneDeep da biblioteca lodash. Para isso precisei me aprofundar no desenvolvimento de funções recursivas, para me auxiliar em descer os níveis de profundidade dos objetos e mantendo uma fácil interpretação e manutenibilidade das mesmas.

Inspirado na função produce da biblioteca Immer, o Simple Immuter opera de modo semelhante. A ideia básica é que você aplicará todas as suas alterações a um draftState temporário, que é uma cópia profunda do currentState. Assim que todas as suas mutações forem concluídas, o Simple Immuter produzirá o nextState com base nas mutações do draftState em cima do currentState. Isso significa que você pode interagir com os seus dados simplesmente modificando-os e mantendo todos os benefícios dos dados imutáveis, isto é, o nextState será um cópia profunda e imutável do currentState.

O baseState não será alterado, mas o nextState será uma nova árvore imutável que reflete todas as alterações feitas no draftState (e compartilhando estruturalmente as coisas que não foram alteradas).

Notas da nova versão:

Nesta versão, foi extraído as funções internas: deepFreeze e deepClone. Foi removido a compatibilidade da função produce, de receber Promises. Não houve mais sentido para isso e com sua remoção, diminuiu a quantidade de responsabilidades de produce, o que facilitou a melhoria do intelisense com TypeScript.

produce(baseState: Object | Array | Map | Set | [, producer: (draftState) => (void | draftState) , producerConfig]): nextState

producer: (opcional) Se for passado uma função, o parâmetro draftState será um clone de baseState, que pode ser alterado dentro da função producer. O nextState será o resultado de draftState em cima do currentState. A função producer pode retornar um valor, este valor é o próprio draftState. Geralmente este valor será retornado em casos de resetar completamente o draftState para um estado inicial.

producerConfig: (opcional) Objeto de configuração da função producer. Possui propriedade freeze que recebe um booleano. Se for true, fará um deepFreeze no resultado final. Se for false, não realizará o deepFreeze. Por padrão é true.

Gerando um clone profundo e imutável com produce

import { si } from '@cahmoraes93/simple-immuter'

const user = {
  name: 'caique',
  age: 28,
  books: ['Sapiens', 'Rápido e Devagar'],
}

const clone = si.produce(user)

console.log(clone)
//=> {  name: 'caique',  age: 28,  books: ['Sapiens', 'Rápido e Devagar'] }

console.log(Object.isFrozen(clone))
//=> true

Gerando clone profundo e imutável com produce, e usando a função producer para atualizar informações do clone resultante

import { si } from '@cahmoraes93/simple-immuter'

const user = {
  name: 'caique',
  age: 28,
  books: ['Sapiens', 'Rápido e Devagar'],
}

const clone = si.produce(user, (draftState) => {
  draftState.name = 'thomas'
  draftState.age = 20
  draftState.books.push('Arquitetura Limpa')
})

console.log(clone)
//=> {  name: 'thomas',  age: 20,  books: ['Sapiens', 'Rápido e Devagar', Arquitetura Limpa] }

console.log(Object.isFrozen(clone))
//=> true

Resetando os valores de draftState

import { si } from '@cahmoraes93/simple-immuter'

const initialState = {
  name: 'caique',
  age: 28,
}

const user = {
  ...user,
  name: 'thomas',
}

const clone = si.produce(user, (draftState) => {
  draftState = initialState
  return draftState
})

console.log(clone)
//=> {  name: 'caique',  age: 28 }

console.log(Object.isFrozen(clone))
//=> true

Gerando clone profundo e mutável com deepClone.

deepClone recebe uma estrutura de dados e gera um clone profundo.

deepClone(baseState: Object | Array | Map | Set): nextState
import { si } from '@cahmoraes93/simple-immuter'

const user = {
  name: 'caique',
  age: 28,
  books: ['Sapiens', 'Rápido e Devagar'],
}

const clone = si.deepClone(user)
clone.name = 'thomas'
clone.books.push('Arquitetura Limpa')

console.log(clone)
//=> {  name: 'thomas',  age: 28,  books: ['Sapiens', 'Rápido e Devagar', 'Arquitetura Limpa'] }

console.log(Object.isFrozen(clone))
//=> false

Gerando clone profundo e imutável com deepFreeze.

deepFreeze recebe uma estrutura de dados e gera um clone profundo e imutável.

deepFreeze(baseState: Object | Array | Map | Set): nextState
import { si } from '@cahmoraes93/simple-immuter'

const user = {
  name: 'caique',
  age: 28,
  books: ['Sapiens', 'Rápido e Devagar'],
}

const clone = si.deepFreeze(user)
clone.name = 'thomas'
clone.books.push('Arquitetura Limpa')

console.log(clone)
//=> {  name: 'caique',  age: 28,  books: ['Sapiens', 'Rápido e Devagar'] }

console.log(Object.isFrozen(clone))
//=> true