@@ -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" ]