{"version":3,"file":"alien.cjs","names":[],"sources":["../src/alien.ts"],"sourcesContent":["/* eslint-disable */\n// Adapted from Alien Signals\n// https://github.com/stackblitz/alien-signals/\n\nexport interface ReactiveNode {\n  deps?: Link\n  depsTail?: Link\n  subs?: Link\n  subsTail?: Link\n  flags: ReactiveFlags\n}\n\nexport interface Link {\n  version: number\n  dep: ReactiveNode\n  sub: ReactiveNode\n  prevSub: Link | undefined\n  nextSub: Link | undefined\n  prevDep: Link | undefined\n  nextDep: Link | undefined\n}\n\ninterface Stack<T> {\n  value: T\n  prev: Stack<T> | undefined\n}\n\nexport const enum ReactiveFlags {\n  None = 0,\n  Mutable = 1,\n  Watching = 2,\n  RecursedCheck = 4,\n  Recursed = 8,\n  Dirty = 16,\n  Pending = 32,\n}\n/*@__NO_SIDE_EFFECTS__*/\nexport function createReactiveSystem({\n  update,\n  notify,\n  unwatched,\n}: {\n  update(sub: ReactiveNode): boolean\n  notify(sub: ReactiveNode): void\n  unwatched(sub: ReactiveNode): void\n}) {\n  return {\n    link,\n    unlink,\n    propagate,\n    checkDirty,\n    shallowPropagate,\n  }\n\n  function link(dep: ReactiveNode, sub: ReactiveNode, version: number): void {\n    const prevDep = sub.depsTail\n    if (prevDep !== undefined && prevDep.dep === dep) {\n      return\n    }\n    const nextDep = prevDep !== undefined ? prevDep.nextDep : sub.deps\n    if (nextDep !== undefined && nextDep.dep === dep) {\n      nextDep.version = version\n      sub.depsTail = nextDep\n      return\n    }\n    const prevSub = dep.subsTail\n    if (\n      prevSub !== undefined &&\n      prevSub.version === version &&\n      prevSub.sub === sub\n    ) {\n      return\n    }\n    const newLink =\n      (sub.depsTail =\n      dep.subsTail =\n        {\n          version,\n          dep,\n          sub,\n          prevDep,\n          nextDep,\n          prevSub,\n          nextSub: undefined,\n        })\n    if (nextDep !== undefined) {\n      nextDep.prevDep = newLink\n    }\n    if (prevDep !== undefined) {\n      prevDep.nextDep = newLink\n    } else {\n      sub.deps = newLink\n    }\n    if (prevSub !== undefined) {\n      prevSub.nextSub = newLink\n    } else {\n      dep.subs = newLink\n    }\n  }\n\n  function unlink(link: Link, sub = link.sub): Link | undefined {\n    const dep = link.dep\n    const prevDep = link.prevDep\n    const nextDep = link.nextDep\n    const nextSub = link.nextSub\n    const prevSub = link.prevSub\n    if (nextDep !== undefined) {\n      nextDep.prevDep = prevDep\n    } else {\n      sub.depsTail = prevDep\n    }\n    if (prevDep !== undefined) {\n      prevDep.nextDep = nextDep\n    } else {\n      sub.deps = nextDep\n    }\n    if (nextSub !== undefined) {\n      nextSub.prevSub = prevSub\n    } else {\n      dep.subsTail = prevSub\n    }\n    if (prevSub !== undefined) {\n      prevSub.nextSub = nextSub\n    } else if ((dep.subs = nextSub) === undefined) {\n      unwatched(dep)\n    }\n    return nextDep\n  }\n\n  function propagate(link: Link): void {\n    let next = link.nextSub\n    let stack: Stack<Link | undefined> | undefined\n\n    top: do {\n      const sub = link.sub\n      let flags = sub.flags\n\n      if (\n        !(\n          flags &\n          (ReactiveFlags.RecursedCheck |\n            ReactiveFlags.Recursed |\n            ReactiveFlags.Dirty |\n            ReactiveFlags.Pending)\n        )\n      ) {\n        sub.flags = flags | ReactiveFlags.Pending\n      } else if (\n        !(flags & (ReactiveFlags.RecursedCheck | ReactiveFlags.Recursed))\n      ) {\n        flags = ReactiveFlags.None\n      } else if (!(flags & ReactiveFlags.RecursedCheck)) {\n        sub.flags = (flags & ~ReactiveFlags.Recursed) | ReactiveFlags.Pending\n      } else if (\n        !(flags & (ReactiveFlags.Dirty | ReactiveFlags.Pending)) &&\n        isValidLink(link, sub)\n      ) {\n        sub.flags = flags | (ReactiveFlags.Recursed | ReactiveFlags.Pending)\n        flags &= ReactiveFlags.Mutable\n      } else {\n        flags = ReactiveFlags.None\n      }\n\n      if (flags & ReactiveFlags.Watching) {\n        notify(sub)\n      }\n\n      if (flags & ReactiveFlags.Mutable) {\n        const subSubs = sub.subs\n        if (subSubs !== undefined) {\n          const nextSub = (link = subSubs).nextSub\n          if (nextSub !== undefined) {\n            stack = { value: next, prev: stack }\n            next = nextSub\n          }\n          continue\n        }\n      }\n\n      if ((link = next!) !== undefined) {\n        next = link.nextSub\n        continue\n      }\n\n      while (stack !== undefined) {\n        link = stack.value!\n        stack = stack.prev\n        if (link !== undefined) {\n          next = link.nextSub\n          continue top\n        }\n      }\n\n      break\n    } while (true)\n  }\n\n  function checkDirty(link: Link, sub: ReactiveNode): boolean {\n    let stack: Stack<Link> | undefined\n    let checkDepth = 0\n    let dirty = false\n\n    top: do {\n      const dep = link.dep\n      const flags = dep.flags\n\n      if (sub.flags & ReactiveFlags.Dirty) {\n        dirty = true\n      } else if (\n        (flags & (ReactiveFlags.Mutable | ReactiveFlags.Dirty)) ===\n        (ReactiveFlags.Mutable | ReactiveFlags.Dirty)\n      ) {\n        if (update(dep)) {\n          const subs = dep.subs!\n          if (subs.nextSub !== undefined) {\n            shallowPropagate(subs)\n          }\n          dirty = true\n        }\n      } else if (\n        (flags & (ReactiveFlags.Mutable | ReactiveFlags.Pending)) ===\n        (ReactiveFlags.Mutable | ReactiveFlags.Pending)\n      ) {\n        if (link.nextSub !== undefined || link.prevSub !== undefined) {\n          stack = { value: link, prev: stack }\n        }\n        link = dep.deps!\n        sub = dep\n        ++checkDepth\n        continue\n      }\n\n      if (!dirty) {\n        const nextDep = link.nextDep\n        if (nextDep !== undefined) {\n          link = nextDep\n          continue\n        }\n      }\n\n      while (checkDepth--) {\n        const firstSub = sub.subs!\n        const hasMultipleSubs = firstSub.nextSub !== undefined\n        if (hasMultipleSubs) {\n          link = stack!.value\n          stack = stack!.prev\n        } else {\n          link = firstSub\n        }\n        if (dirty) {\n          if (update(sub)) {\n            if (hasMultipleSubs) {\n              shallowPropagate(firstSub)\n            }\n            sub = link.sub\n            continue\n          }\n          dirty = false\n        } else {\n          sub.flags &= ~ReactiveFlags.Pending\n        }\n        sub = link.sub\n        const nextDep = link.nextDep\n        if (nextDep !== undefined) {\n          link = nextDep\n          continue top\n        }\n      }\n\n      return dirty\n    } while (true)\n  }\n\n  function shallowPropagate(link: Link): void {\n    do {\n      const sub = link.sub\n      const flags = sub.flags\n      if (\n        (flags & (ReactiveFlags.Pending | ReactiveFlags.Dirty)) ===\n        ReactiveFlags.Pending\n      ) {\n        sub.flags = flags | ReactiveFlags.Dirty\n        if (\n          (flags & (ReactiveFlags.Watching | ReactiveFlags.RecursedCheck)) ===\n          ReactiveFlags.Watching\n        ) {\n          notify(sub)\n        }\n      }\n    } while ((link = link.nextSub!) !== undefined)\n  }\n\n  function isValidLink(checkLink: Link, sub: ReactiveNode): boolean {\n    let link = sub.depsTail\n    while (link !== undefined) {\n      if (link === checkLink) {\n        return true\n      }\n      link = link.prevDep\n    }\n    return false\n  }\n}\n"],"mappings":"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"}