{"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 type ReactiveFlags = number\n\nexport const NONE = 0\nexport const MUTABLE = 1\nexport const WATCHING = 2\nexport const RECURSED_CHECK = 4\nexport const RECURSED = 8\nexport const DIRTY = 16\nexport const PENDING = 32\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 (!(flags & (RECURSED_CHECK | RECURSED | DIRTY | PENDING))) {\n        sub.flags = flags | PENDING\n      } else if (!(flags & (RECURSED_CHECK | RECURSED))) {\n        flags = NONE\n      } else if (!(flags & RECURSED_CHECK)) {\n        sub.flags = (flags & ~RECURSED) | PENDING\n      } else if (!(flags & (DIRTY | PENDING)) && isValidLink(link, sub)) {\n        sub.flags = flags | (RECURSED | PENDING)\n        flags &= MUTABLE\n      } else {\n        flags = NONE\n      }\n\n      if (flags & WATCHING) {\n        notify(sub)\n      }\n\n      if (flags & 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 & DIRTY) {\n        dirty = true\n      } else if ((flags & (MUTABLE | DIRTY)) === (MUTABLE | DIRTY)) {\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 ((flags & (MUTABLE | PENDING)) === (MUTABLE | PENDING)) {\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 &= ~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 ((flags & (PENDING | DIRTY)) === PENDING) {\n        sub.flags = flags | DIRTY\n        if ((flags & (WATCHING | RECURSED_CHECK)) === WATCHING) {\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":";;AA6BA,MAAa,OAAO;AACpB,MAAa,UAAU;AACvB,MAAa,WAAW;AACxB,MAAa,iBAAiB;AAC9B,MAAa,WAAW;AACxB,MAAa,QAAQ;AACrB,MAAa,UAAU;;AAEvB,SAAgB,qBAAqB,EACnC,QACA,QACA,aAKC;AACD,QAAO;EACL;EACA;EACA;EACA;EACA;EACD;CAED,SAAS,KAAK,KAAmB,KAAmB,SAAuB;EACzE,MAAM,UAAU,IAAI;AACpB,MAAI,YAAY,UAAa,QAAQ,QAAQ,IAC3C;EAEF,MAAM,UAAU,YAAY,SAAY,QAAQ,UAAU,IAAI;AAC9D,MAAI,YAAY,UAAa,QAAQ,QAAQ,KAAK;AAChD,WAAQ,UAAU;AAClB,OAAI,WAAW;AACf;;EAEF,MAAM,UAAU,IAAI;AACpB,MACE,YAAY,UACZ,QAAQ,YAAY,WACpB,QAAQ,QAAQ,IAEhB;EAEF,MAAM,UACH,IAAI,WACL,IAAI,WACF;GACE;GACA;GACA;GACA;GACA;GACA;GACA,SAAS;GACV;AACL,MAAI,YAAY,OACd,SAAQ,UAAU;AAEpB,MAAI,YAAY,OACd,SAAQ,UAAU;MAElB,KAAI,OAAO;AAEb,MAAI,YAAY,OACd,SAAQ,UAAU;MAElB,KAAI,OAAO;;CAIf,SAAS,OAAO,MAAY,MAAM,KAAK,KAAuB;EAC5D,MAAM,MAAM,KAAK;EACjB,MAAM,UAAU,KAAK;EACrB,MAAM,UAAU,KAAK;EACrB,MAAM,UAAU,KAAK;EACrB,MAAM,UAAU,KAAK;AACrB,MAAI,YAAY,OACd,SAAQ,UAAU;MAElB,KAAI,WAAW;AAEjB,MAAI,YAAY,OACd,SAAQ,UAAU;MAElB,KAAI,OAAO;AAEb,MAAI,YAAY,OACd,SAAQ,UAAU;MAElB,KAAI,WAAW;AAEjB,MAAI,YAAY,OACd,SAAQ,UAAU;YACR,IAAI,OAAO,aAAa,OAClC,WAAU,IAAI;AAEhB,SAAO;;CAGT,SAAS,UAAU,MAAkB;EACnC,IAAI,OAAO,KAAK;EAChB,IAAI;AAEJ,MAAK,IAAG;GACN,MAAM,MAAM,KAAK;GACjB,IAAI,QAAQ,IAAI;AAEhB,OAAI,EAAE,QAAS,IACb,KAAI,QAAQ;YACH,EAAE,iBACX;YACS,EAAE,WACX,KAAI,QAAS,QAAQ;YACZ,EAAE,sBAA8B,YAAY,MAAM,IAAI,EAAE;AACjE,QAAI,QAAQ;AACZ;SAEA;AAGF,OAAI,UACF,QAAO,IAAI;AAGb,OAAI,WAAiB;IACnB,MAAM,UAAU,IAAI;AACpB,QAAI,YAAY,QAAW;KACzB,MAAM,WAAW,OAAO,SAAS;AACjC,SAAI,YAAY,QAAW;AACzB,cAAQ;OAAE,OAAO;OAAM,MAAM;OAAO;AACpC,aAAO;;AAET;;;AAIJ,QAAK,OAAO,UAAW,QAAW;AAChC,WAAO,KAAK;AACZ;;AAGF,UAAO,UAAU,QAAW;AAC1B,WAAO,MAAM;AACb,YAAQ,MAAM;AACd,QAAI,SAAS,QAAW;AACtB,YAAO,KAAK;AACZ,cAAS;;;AAIb;WACO;;CAGX,SAAS,WAAW,MAAY,KAA4B;EAC1D,IAAI;EACJ,IAAI,aAAa;EACjB,IAAI,QAAQ;AAEZ,MAAK,IAAG;GACN,MAAM,MAAM,KAAK;GACjB,MAAM,QAAQ,IAAI;AAElB,OAAI,IAAI,WACN,SAAQ;aACE,gCACV;QAAI,OAAO,IAAI,EAAE;KACf,MAAM,OAAO,IAAI;AACjB,SAAI,KAAK,YAAY,OACnB,kBAAiB,KAAK;AAExB,aAAQ;;eAEA,gCAAsD;AAChE,QAAI,KAAK,YAAY,UAAa,KAAK,YAAY,OACjD,SAAQ;KAAE,OAAO;KAAM,MAAM;KAAO;AAEtC,WAAO,IAAI;AACX,UAAM;AACN,MAAE;AACF;;AAGF,OAAI,CAAC,OAAO;IACV,MAAM,UAAU,KAAK;AACrB,QAAI,YAAY,QAAW;AACzB,YAAO;AACP;;;AAIJ,UAAO,cAAc;IACnB,MAAM,WAAW,IAAI;IACrB,MAAM,kBAAkB,SAAS,YAAY;AAC7C,QAAI,iBAAiB;AACnB,YAAO,MAAO;AACd,aAAQ,MAAO;UAEf,QAAO;AAET,QAAI,OAAO;AACT,SAAI,OAAO,IAAI,EAAE;AACf,UAAI,gBACF,kBAAiB,SAAS;AAE5B,YAAM,KAAK;AACX;;AAEF,aAAQ;UAER,KAAI,SAAS;AAEf,UAAM,KAAK;IACX,MAAM,UAAU,KAAK;AACrB,QAAI,YAAY,QAAW;AACzB,YAAO;AACP,cAAS;;;AAIb,UAAO;WACA;;CAGX,SAAS,iBAAiB,MAAkB;AAC1C,KAAG;GACD,MAAM,MAAM,KAAK;GACjB,MAAM,QAAQ,IAAI;AAClB,QAAK,2BAAwC;AAC3C,QAAI,QAAQ;AACZ,SAAK,uBACH,QAAO,IAAI;;YAGP,OAAO,KAAK,aAAc;;CAGtC,SAAS,YAAY,WAAiB,KAA4B;EAChE,IAAI,OAAO,IAAI;AACf,SAAO,SAAS,QAAW;AACzB,OAAI,SAAS,UACX,QAAO;AAET,UAAO,KAAK;;AAEd,SAAO"}