packages feed

hyperbole-0.7.1: src/Web/Hyperbole/View/ViewId.hs

{-# LANGUAGE DefaultSignatures #-}

module Web.Hyperbole.View.ViewId where

import Data.Kind (Type)
import GHC.Generics
import Web.Hyperbole.Data.Encoded as Encoded


{- ! A unique identifier for a 'HyperView'

@
#EMBED Example.Simple data Message
@
-}

{- | A unique identifier for a 'HyperView'

@
data Message = Message1 | Message2
  deriving (Generic, 'ViewId')
@
-}
class ViewId a where
  -- | Most hyperviews are stateless, but you can track internal state by setting this to something other than `()`
  type ViewState a :: Type


  type ViewState a = ()


  toViewId :: a -> Encoded
  default toViewId :: (Generic a, GToEncoded (Rep a)) => a -> Encoded
  toViewId = genericToEncoded


  parseViewId :: Encoded -> Either String a
  default parseViewId :: (Generic a, GFromEncoded (Rep a)) => Encoded -> Either String a
  parseViewId = genericParseEncoded


instance ViewId () where
  toViewId _ = mempty
  parseViewId _ = pure ()