packages feed

heftia-0.1.0.0: src/Control/Heftia.hs

{-# LANGUAGE QuantifiedConstraints #-}

-- This Source Code Form is subject to the terms of the Mozilla Public
-- License, v. 2.0. If a copy of the MPL was not distributed with this
-- file, You can obtain one at https://mozilla.org/MPL/2.0/.

{- |
Copyright   :  (c) 2023 Yamada Ryo
License     :  MPL-2.0 (see the file LICENSE)
Maintainer  :  ymdfield@outlook.jp
Stability   :  experimental
Portability :  portable

A type class to abstract away the encoding details of the Heftia carriers.
-}
module Control.Heftia where

import Control.Effect.Class (LiftIns, unliftIns, type (~>))
import Control.Effect.Class.Machinery.HFunctor (HFunctor)

-- | A type class to abstract away the encoding details of the Heftia carrier.
class (forall sig. HFunctor sig => c (h sig)) => Heftia c h | h -> c where
    {-# MINIMAL liftSig, interpretHH #-}

    -- | Lift a /signature/ into a Heftia carrier.
    liftSig :: HFunctor sig => sig (h sig) a -> h sig a

    interpretHH :: (c m, HFunctor sig) => (sig m ~> m) -> h sig a -> m a

    -- | Translate /signature/s embedded in a Heftia carrier.
    translateHH ::
        (HFunctor sig, HFunctor sig') =>
        (sig (h sig') ~> sig' (h sig')) ->
        h sig a ->
        h sig' a
    translateHH phi = interpretHH $ liftSig . phi
    {-# INLINE translateHH #-}

    reinterpretHH :: HFunctor sig => (sig (h sig) ~> h sig) -> h sig a -> h sig a
    reinterpretHH = interpretHH
    {-# INLINE reinterpretHH #-}

retractH :: (Heftia c h, c m) => h (LiftIns m) a -> m a
retractH = interpretHH unliftIns
{-# INLINE retractH #-}