packages feed

managed-functions-1.1.0.0: src/Data/Managed/Encoding.hs

{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE StarIsType #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Data.Managed.Encoding where

import Data.Kind (Type)

class Encoding a where
  type In a :: Type
  type Out a :: Type

class Encode t rep where
  encode :: t -> Out rep

class Decode t rep where
  decode :: In rep -> Maybe t

withEncoding ::
     forall e i o. (Encode o e, Decode i e)
  => (i -> o)
  -> In e
  -> Maybe (Out e)
withEncoding f i = do
  decoded <- decode @i @e i
  let applied = f decoded
  return $ encode @o @e applied