diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cb6a3c2..d02e659 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,8 +2,7 @@ name: Release on: release: - types: - - published + types: [published] jobs: release: @@ -20,10 +19,7 @@ jobs: - name: Build model run: rojo build -o charm.rbxm - - name: Upload release - uses: softprops/action-gh-release@v2 - if: ${{ github.event.release }} + - uses: AButler/upload-release-assets@v3.0 with: - files: charm.rbxm - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + files: "charm.rbxm" + repo-token: ${{ secrets.GITHUB_TOKEN }} diff --git a/images/logo.png b/images/logo.png index 7f4915e..22041c7 100644 Binary files a/images/logo.png and b/images/logo.png differ diff --git a/src/atom.luau b/src/atom.luau index 4d87a7e..17eb224 100644 --- a/src/atom.luau +++ b/src/atom.luau @@ -17,7 +17,7 @@ export type Atom = (() -> T) & ((state: T | ((T) -> T)) -> ()) & { get: ((self: Atom) -> T) & ((self: Atom, selector: (T) -> Result) -> Result), set: (self: Atom, state: T | ((T) -> T)) -> (), memo: (self: Atom, equalityFn: (previous: T, current: T) -> boolean) -> Atom, - writable: (self: Atom, setter: ((update: T, previous: T) -> T?) & (update: T, previous: T) -> ()) -> Atom, + writable: (self: Atom, onSet: ((update: T, previous: T) -> T?) & (update: T, previous: T) -> ()) -> Atom, readonly: (self: Atom) -> ReadonlyAtom, named: (self: Atom, label: string) -> Atom, unmount: (self: Atom) -> (), @@ -26,9 +26,8 @@ export type Atom = (() -> T) & ((state: T | ((T) -> T)) -> ()) & { export type ReadonlyAtom = (() -> T) & { get: ((self: ReadonlyAtom) -> T) & ((self: ReadonlyAtom, selector: (T) -> Result) -> Result), memo: (self: ReadonlyAtom, equalityFn: (previous: T, current: T) -> boolean) -> ReadonlyAtom, - writable: ((self: Atom) -> Atom) & ( - (self: Atom, setter: ((update: T, previous: T) -> T?) & (update: T, previous: T) -> ()) -> Atom - ), + writable: ((self: Atom) -> Atom) + & ((self: Atom, onSet: ((update: T, previous: T) -> T?) & (update: T, previous: T) -> ()) -> Atom), readonly: (self: ReadonlyAtom) -> ReadonlyAtom, named: (self: ReadonlyAtom, label: string) -> ReadonlyAtom, unmount: (self: ReadonlyAtom) -> (), @@ -97,8 +96,8 @@ local function atom(state: State): Atom return self end - function atom:writable(setterFn: ((State, State) -> State?)?): Atom - setter = setterFn + function atom:writable(onSet: ((State, State) -> State?)?): Atom + setter = onSet return self end diff --git a/src/derive.luau b/src/derive.luau index 2b40c88..6a62f41 100644 --- a/src/derive.luau +++ b/src/derive.luau @@ -16,7 +16,6 @@ local function derive(...): ReadonlyAtom local atoms: { Atom } = { ... } local combiner: (...unknown) -> Result = table.remove(atoms) :: any local size = #atoms - local dependencies: { unknown } = {} for index, atom in atoms do diff --git a/src/react/useAtomState.luau b/src/react/useAtomState.luau index 9deebbc..bcedd38 100644 --- a/src/react/useAtomState.luau +++ b/src/react/useAtomState.luau @@ -6,7 +6,7 @@ type Atom = atom.Atom type UseAtomState = ((atom: Atom) -> State) & ((atom: Atom, ((State) -> Result)?) -> State | Result) - & (atom: Atom, selector: (State) -> Result) -> Result + & ((atom: Atom, selector: (State) -> Result) -> Result) local function useAtomState(atom: Atom, selector: ((State) -> State)?): State local state, setState = React.useState(function() diff --git a/src/split.luau b/src/split.luau index 285c18f..6152c3a 100644 --- a/src/split.luau +++ b/src/split.luau @@ -55,9 +55,10 @@ local function split( for key, item in previousItems do local id = if keyExtractor then keyExtractor(item) else key + local atom = atoms[id] - if itemsByKeys[id] == nil then - atoms[id]:unmount() + if itemsByKeys[id] == nil and atom then + atom:unmount() atoms[id] = nil end end diff --git a/src/subscribe.luau b/src/subscribe.luau index 30af236..be2b074 100644 --- a/src/subscribe.luau +++ b/src/subscribe.luau @@ -3,7 +3,7 @@ type Atom = atom.Atom local reference = require(script.Parent.utils.reference) -local function subscribe(atom: Atom, callback: (state: State, lastState: State) -> ()): (() -> (), () -> ()) +local function subscribe(atom: Atom, callback: (state: State, previous: State) -> ()): (() -> (), () -> ()) local pending: thread? = nil local state = atom:get()