typed-encoding-0.2.1.0: src/Data/TypedEncoding/Internal/Class.hs
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
-- {-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
-- {-# LANGUAGE TypeFamilies #-}
-- {-# LANGUAGE TypeApplications #-}
-- {-# LANGUAGE AllowAmbiguousTypes #-}
module Data.TypedEncoding.Internal.Class (
module Data.TypedEncoding.Internal.Class
, module Data.TypedEncoding.Internal.Class.Util
, module Data.TypedEncoding.Internal.Class.Encode
, module Data.TypedEncoding.Internal.Class.Decode
, module Data.TypedEncoding.Internal.Class.Recreate
) where
import Data.TypedEncoding.Internal.Class.Util
import Data.TypedEncoding.Internal.Class.Encode
import Data.TypedEncoding.Internal.Class.Decode
import Data.TypedEncoding.Internal.Class.Recreate
import Data.TypedEncoding.Internal.Types (Enc(..)
, withUnsafeCoerce)
import Data.Functor.Identity
import GHC.TypeLits
-- |
-- Generalized Java @toString@ or a type safe version of Haskell's 'Show'.
--
-- Encodes @a@ as @Enc '[xs]@.
--
class KnownSymbol x => ToEncString x str f a where
toEncStringF :: a -> f (Enc '[x] () str)
toEncString :: forall x str f a . (ToEncString x str Identity a) => a -> Enc '[x] () str
toEncString = runIdentity . toEncStringF
-- |
-- Reverse of 'ToEncString' decodes encoded string back to @a@
class (KnownSymbol x) => FromEncString a f str x where
fromEncStringF :: Enc '[x] () str -> f a
fromEncString :: forall a str x . (FromEncString a Identity str x) => Enc '[x] () str -> a
fromEncString = runIdentity . fromEncStringF
-- Other classes --
-- | subsets are useful for restriction encodings
-- like r-UFT8 but not for other encodings.
class Superset (y :: Symbol) (x :: Symbol) where
inject :: Enc (x ': xs) c str -> Enc (y ': xs) c str
inject = withUnsafeCoerce id
class FlattenAs (y :: Symbol) (x :: Symbol) where
flattenAs :: Enc (x ': xs) c str -> Enc '[y] c str
flattenAs = withUnsafeCoerce id