1 module Webc.Classes where
3 import Data.Function ((.))
4 import Network.URI.Slug qualified as URI
5 import Symantic.Classes (ProductFunctor (..))
12 -- | Syntax (final algebra) for expressing URL paths.
13 class Slugable repr where
14 slug :: URI.Slug -> repr ()
16 -- | Pattern-matchable encoding (initial algebra) of 'Slugable'.
17 data instance Route Slugable repr a where
18 Slug :: URI.Slug -> Route Slugable repr ()
20 -- | Initial to final algebra.
21 instance Slugable repr => Derivable (Route Slugable repr) where
25 -- | Final to initial algebra.
26 instance Slugable repr => Slugable (SomeRoute repr) where
27 slug = SomeRoute . Slug
29 -- | Convenient alias for an @index.html@ page.
30 index :: Slugable repr => repr ()
31 index = slug "index.html"
33 -- | Convenient alias.
35 ProductFunctor repr =>