{"version":3,"file":"utils.mjs","sources":["../src/index.tsx"],"sourcesContent":["import { ReadonlySignal, Signal } from \"@preact/signals-core\";\nimport { useSignal } from \"@preact/signals-react\";\nimport { useSignals } from \"@preact/signals-react/runtime\";\nimport {\n\tFragment,\n\tcreateElement,\n\tuseMemo,\n\tReactNode,\n\tuseLayoutEffect,\n\tuseEffect,\n} from \"react\";\n\ninterface ShowProps<T = boolean> {\n\twhen: Signal<T> | ReadonlySignal<T> | (() => T);\n\tfallback?: ReactNode;\n\tchildren: ReactNode | ((value: NonNullable<T>) => ReactNode);\n}\n\nconst Item = (props: any) => {\n\tuseSignals();\n\treturn typeof props.children === \"function\"\n\t\t? props.children(props.v, props.i)\n\t\t: props.children;\n};\n\nItem.displayName = \"Item\";\n\nexport function Show<T = boolean>(props: ShowProps<T>): JSX.Element | null {\n\tuseSignals();\n\tconst value =\n\t\ttypeof props.when === \"function\" ? props.when() : props.when.value;\n\tif (!value) return (props.fallback as JSX.Element) || null;\n\treturn <Item v={value} children={props.children} />;\n}\n\nShow.displayName = \"Show\";\n\ninterface ForProps<T> {\n\teach:\n\t\t| Signal<Array<T>>\n\t\t| ReadonlySignal<Array<T>>\n\t\t| (() => Array<T> | Signal<Array<T>> | ReadonlySignal<Array<T>>);\n\tfallback?: ReactNode;\n\tgetKey?: (item: T, index: number) => string | number;\n\tchildren: (value: T, index: number) => ReactNode;\n}\n\nexport function For<T>(props: ForProps<T>): JSX.Element | null {\n\tuseSignals();\n\tconst cache = useMemo(() => new Map(), []);\n\tconst list = (typeof props.each === \"function\" ? props.each() : props.each) as\n\t\t| Signal<Array<T>>\n\t\t| Array<T>;\n\n\tconst listValue = list instanceof Signal ? list.value : list;\n\n\tif (!listValue.length) return (props.fallback as JSX.Element) || null;\n\n\tconst removed = new Set(cache.keys());\n\n\tconst items = listValue.map((value, index) => {\n\t\tremoved.delete(value);\n\t\tif (!cache.has(value)) {\n\t\t\tconst key = props.getKey ? props.getKey(value, index) : index;\n\t\t\tconst result = (\n\t\t\t\t<Item v={value} key={key} i={index} children={props.children} />\n\t\t\t);\n\t\t\tcache.set(value, result);\n\t\t\treturn result;\n\t\t}\n\t\treturn cache.get(value);\n\t});\n\n\tremoved.forEach(value => {\n\t\tcache.delete(value);\n\t});\n\n\treturn createElement(Fragment, { children: items });\n}\n\nFor.displayName = \"For\";\n\nconst useIsomorphicLayoutEffect =\n\ttypeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\nexport function useLiveSignal<T>(value: T): Signal<T> {\n\tconst s = useSignal(value);\n\tuseIsomorphicLayoutEffect(() => {\n\t\tif (s.peek() !== value) s.value = value;\n\t}, [value]);\n\treturn s;\n}\n\nexport function useSignalRef<T>(value: T) {\n\tconst ref = useSignal(value) as Signal<T> & { current: T };\n\tif (!(\"current\" in ref))\n\t\tObject.defineProperty(ref, \"current\", refSignalProto);\n\treturn ref;\n}\nconst refSignalProto = {\n\tconfigurable: true,\n\tget(this: Signal) {\n\t\treturn this.value;\n\t},\n\tset(this: Signal, v: any) {\n\t\tthis.value = v;\n\t},\n};\n"],"names":["Item","props","useSignals","children","v","i","displayName","Show","value","when","fallback","createElement","For","cache","useMemo","Map","list","each","listValue","Signal","length","removed","Set","keys","items","map","index","delete","has","key","getKey","result","set","get","forEach","Fragment","useIsomorphicLayoutEffect","window","useLayoutEffect","useEffect","useLiveSignal","s","useSignal","peek","useSignalRef","ref","Object","defineProperty","refSignalProto","configurable","this"],"mappings":"2PAkBA,MAAMA,EAAQC,IACbC,IACA,MAAiC,mBAAnBD,EAAME,SACjBF,EAAME,SAASF,EAAMG,EAAGH,EAAMI,GAC9BJ,EAAME,UAGVH,EAAKM,YAAc,OAEb,SAAUC,EAAkBN,GACjCC,IACA,MAAMM,EACiB,mBAAfP,EAAMQ,KAAsBR,EAAMQ,OAASR,EAAMQ,KAAKD,MAC9D,IAAKA,EAAO,OAAQP,EAAMS,UAA4B,UACtD,OAAOC,EAACX,EAAK,CAAAI,EAAGI,EAAOL,SAAUF,EAAME,UACxC,CAEAI,EAAKD,YAAc,OAYb,SAAUM,EAAOX,GACtBC,IACA,MAAMW,EAAQC,EAAQ,IAAM,IAAIC,IAAO,IACjCC,EAA8B,mBAAff,EAAMgB,KAAsBhB,EAAMgB,OAAShB,EAAMgB,KAIhEC,EAAYF,aAAgBG,EAASH,EAAKR,MAAQQ,EAExD,IAAKE,EAAUE,OAAQ,OAAQnB,EAAMS,UAA4B,KAEjE,MAAMW,EAAU,IAAIC,IAAIT,EAAMU,QAExBC,EAAQN,EAAUO,IAAI,CAACjB,EAAOkB,KACnCL,EAAQM,OAAOnB,GACf,IAAKK,EAAMe,IAAIpB,GAAQ,CACtB,MAAMqB,EAAM5B,EAAM6B,OAAS7B,EAAM6B,OAAOtB,EAAOkB,GAASA,EAClDK,EACLpB,EAACX,GAAKI,EAAGI,EAAOqB,IAAKA,EAAKxB,EAAGqB,EAAOvB,SAAUF,EAAME,WAErDU,EAAMmB,IAAIxB,EAAOuB,GACjB,OAAOA,CACR,CACA,OAAOlB,EAAMoB,IAAIzB,EAAK,GAGvBa,EAAQa,QAAQ1B,IACfK,EAAMc,OAAOnB,EAAK,GAGnB,OAAOG,EAAcwB,EAAU,CAAEhC,SAAUqB,GAC5C,CAEAZ,EAAIN,YAAc,MAElB,MAAM8B,EACa,oBAAXC,OAAyBC,EAAkBC,EAE7C,SAAUC,EAAiBhC,GAChC,MAAMiC,EAAIC,UAAUlC,GACpB4B,EAA0B,KACzB,GAAIK,EAAEE,SAAWnC,EAAOiC,EAAEjC,MAAQA,GAChC,CAACA,IACJ,OAAOiC,CACR,CAEM,SAAUG,EAAgBpC,GAC/B,MAAMqC,EAAMH,UAAUlC,GACtB,KAAM,YAAaqC,GAClBC,OAAOC,eAAeF,EAAK,UAAWG,GACvC,OAAOH,CACR,CACA,MAAMG,EAAiB,CACtBC,cAAc,EACdhB,MACC,OAAWiB,KAAC1C,KACb,EACAwB,IAAkB5B,GACjB8C,KAAK1C,MAAQJ,CACd,UACAQ,SAAAL,UAAAiC,mBAAAI"}