module Pandora.Pattern.Functor.Representable where
import Pandora.Core.Functor (type (<-|))
import Pandora.Core.Morphism ((%))
import Pandora.Pattern.Category (identity)
import Pandora.Pattern.Functor.Pointable (Pointable)
class Pointable t => Representable t where
{-# MINIMAL (<#>), tabulate #-}
type Representation t :: *
(<#>) :: Representation t -> a <-| t
tabulate :: (Representation t -> a) -> t a
index :: t a -> Representation t -> a
index x r = r <#> x
instance Representable ((->) e) where
type Representation ((->) e) = e
(<#>) = (identity %)
tabulate = identity