packages feed

seihou-core-0.5.0.0: src/Seihou/Effect/BaselineStore.hs

module Seihou.Effect.BaselineStore
  ( BaselineStore (..),
    BaselineError (..),
    putBaseline,
    readBaseline,
    pruneBaselines,
  )
where

import Data.Set (Set)
import Seihou.Core.Types (BaselineRef, SHA256)
import Seihou.Prelude

-- | Failures that make a generated baseline unavailable. Store failures are
-- represented here for callers that validate the project file before writing;
-- interpreter-level filesystem exceptions still propagate through 'IOE'.
data BaselineError
  = BaselineMissing BaselineRef
  | BaselineCorrupt BaselineRef SHA256
  | BaselineStoreFailure Text
  deriving stock (Eq, Show)

-- | Content-addressed storage for generated file ancestors.
data BaselineStore :: Effect where
  PutBaseline :: Text -> BaselineStore m BaselineRef
  ReadBaseline :: BaselineRef -> BaselineStore m (Either BaselineError Text)
  PruneBaselines :: Set BaselineRef -> BaselineStore m [BaselineRef]

type instance DispatchOf BaselineStore = Dynamic

putBaseline :: (BaselineStore :> es) => Text -> Eff es BaselineRef
putBaseline content = send (PutBaseline content)

readBaseline :: (BaselineStore :> es) => BaselineRef -> Eff es (Either BaselineError Text)
readBaseline ref = send (ReadBaseline ref)

pruneBaselines :: (BaselineStore :> es) => Set BaselineRef -> Eff es [BaselineRef]
pruneBaselines refs = send (PruneBaselines refs)