packages feed

nano-ui-0.1.0.0: lib/NanoUI/Compact.hs

{-# LANGUAGE TypeApplications #-}

module NanoUI.Compact
  ( Compact
  , compactHost
  , askCompact
  ) where

import Data.Typeable (Typeable)
import Effectful (Eff, type (:>))
import GHC.Compact (Compact, compact, getCompact)
import NanoUI.Context (Context, setHost)
import NanoUI.Monad (Ui, askHost)

-- Pin read-heavy app state so GC treats it as one block.
compactHost :: Typeable a => Context -> a -> IO (Compact a)
compactHost ctx a = do
  region <- compact a
  setHost ctx region
  pure region

askCompact :: forall a es. (Typeable a, Ui :> es) => Eff es (Maybe a)
askCompact = do
  region <- askHost @(Compact a)
  pure (fmap getCompact region)