git.iko.soy/rowtype-yoga/purescript-backend-optimizer
on main help sign in
77 lines 2.4 kB history raw
1module Snapshot.HalogenVDomST01 where
3import Prelude
5import Control.Monad.ST.Class (liftST)
6import Data.Array as Array
7import Data.Array.ST as STArray
8import Effect (forE, foreachE)
9import Effect.Uncurried (EffectFn2, EffectFn3, EffectFn4, EffectFn5, EffectFn6, mkEffectFn5, mkEffectFn6, runEffectFn2, runEffectFn3, runEffectFn4)
10import Foreign.Object (Object)
11import Foreign.Object as Object
12import Foreign.Object.ST as STObject
13import Foreign.Object.ST.Unsafe as STObject.Unsafe
14import Foreign.Object.Unsafe as Object.Unsafe
15import Partial.Unsafe as Partial
17diffWithIxE
18 :: forall b c d
19 . EffectFn5
20 (Array b)
21 (Array c)
22 (EffectFn3 Int b c d)
23 (EffectFn2 Int b Unit)
24 (EffectFn2 Int c d)
25 (Array d)
26diffWithIxE = mkEffectFn5 \a1 a2 f1 f2 f3 -> do
27 a3 <- liftST $ STArray.new
28 let l1 = Array.length a1
29 let l2 = Array.length a2
30 let l3 = if l1 < l2 then l2 else l1
31 forE 0 l3 \i ->
32 if i < l1 then
33 if i < l2 then do
34 let v1 = Partial.unsafePartial Array.unsafeIndex a1 i
35 let v2 = Partial.unsafePartial Array.unsafeIndex a2 i
36 v3 <- runEffectFn3 f1 i v1 v2
37 void $ liftST $ STArray.push v3 a3
38 else do
39 let v1 = Partial.unsafePartial Array.unsafeIndex a1 i
40 runEffectFn2 f2 i v1
41 else if i < l2 then do
42 let v2 = Partial.unsafePartial Array.unsafeIndex a2 i
43 v3 <- runEffectFn2 f3 i v2
44 void $ liftST $ STArray.push v3 a3
45 else
46 pure unit
47 liftST $ STArray.unsafeFreeze a3
49diffWithKeyAndIxE
50 :: forall a b c d
51 . EffectFn6
52 (Object a)
53 (Array b)
54 (b -> String)
55 (EffectFn4 String Int a b c)
56 (EffectFn2 String a d)
57 (EffectFn3 String Int b c)
58 (Object c)
59diffWithKeyAndIxE = mkEffectFn6 \o1 as fk f1 f2 f3 -> do
60 o2 <- liftST STObject.new
61 forE 0 (Array.length as) \i -> do
62 let a = Partial.unsafePartial Array.unsafeIndex as i
63 let k = fk a
64 if Object.member k o1 then do
65 let v1 = Object.Unsafe.unsafeIndex o1 k
66 v2 <- runEffectFn4 f1 k i v1 a
67 void $ liftST $ STObject.poke k v2 o2
68 else do
69 v2 <- runEffectFn3 f3 k i a
70 void $ liftST $ STObject.poke k v2 o2
71 o3 <- liftST $ STObject.Unsafe.unsafeFreeze o2
72 foreachE (Object.keys o1) \k ->
73 if Object.member k o3 then
74 pure unit
75 else
76 void $ runEffectFn2 f2 k (Object.Unsafe.unsafeIndex o1 k)
77 pure o3