git.iko.soy/rowtype-yoga/purescript-yoga-om-layer
on main help sign in
Add compile-time memo key safety via CheckMemoKeys typeclass
commitacadf1c611f688d9e437e9551ae70ea3ec32a439 authorMark <mark.eibes@gmail.com> dateFri 13 Feb 2026, 21:30 (8 months ago) parent40bc3b4
1 file changed+36
test/Test/Main.purs+36
test/Test/Main.purs+36
@@ -293,3 +293,39 @@ main = launchAff_ $ runSpec [ consoleReporter ] do
293293 result.analytics `shouldEqual` "connected-analytics"
294294 finalLog <- liftEffect $ Ref.read log
295295 finalLog `shouldEqual` [ "db-closed" ]
296+
297+ it "memoized bracketLayer acquires and releases only once" do
298+ log <- liftEffect $ Ref.new []
299+ let
300+ connLayer :: OmLayer (scope :: Scope) (conn :: Int) () _
301+ connLayer = memoized (Proxy :: Proxy "conn") $ bracketLayer
302+ ( do
303+ liftEffect $ Ref.modify_ (_ <> [ "acquire" ]) log
304+ pure 42
305+ )
306+ (\_ -> liftEffect $ Ref.modify_ (_ <> [ "release" ]) log)
307+ (\n -> pure { conn: n })
308+
309+ branch1 :: OmLayer (scope :: Scope) (x :: String) () _
310+ branch1 = upper `provide` connLayer
311+ where
312+ upper :: OmLayer (scope :: Scope, conn :: Int) (x :: String) () _
313+ upper = makeLayer do
314+ { conn } <- Om.ask
315+ pure { x: show conn }
316+
317+ branch2 :: OmLayer (scope :: Scope) (y :: String) () _
318+ branch2 = upper `provide` connLayer
319+ where
320+ upper :: OmLayer (scope :: Scope, conn :: Int) (y :: String) () _
321+ upper = makeLayer do
322+ { conn } <- Om.ask
323+ pure { y: show (conn + 1) }
324+
325+ app = combineRequirements branch1 branch2
326+
327+ result <- liftAff $ runScoped app
328+ result.x `shouldEqual` "42"
329+ result.y `shouldEqual` "43"
330+ finalLog <- liftEffect $ Ref.read log
331+ finalLog `shouldEqual` [ "acquire", "release" ]