) where
import Control.Applicative (Applicative)
-import Control.Monad (Monad)
+import Control.Monad (Monad (..))
import Control.Monad.Classes qualified as MC
import Control.Monad.Trans.Class as MT
import Data.Bool (Bool (..))
import Data.ByteString.Lazy qualified as BSL
import Data.Either (Either (..))
import Data.Function ((.))
-import Data.Functor as Functor
+import Data.Functor (Functor)
import Data.Kind (Constraint, Type)
import Data.Maybe (Maybe)
import Data.Typeable (Typeable)
SumFunctor (..),
ToFEndpoint,
ToFable,
+ Voidable (..),
dataType,
pattern (:!:),
type (-->),
-- pathSegment :: PathSegment -> sem a -> sem a
pathSegment :: PathSegment -> sem ()
- default pathSegment :: (FromDerived PathSegmentable sem) => PathSegment -> sem ()
+ default pathSegment :: FromDerived PathSegmentable sem => PathSegment -> sem ()
-- default pathSegment :: IsoFunctor sem => PathSegment -> sem ()
-- pathSegment s = Iso (const ()) (const s) <%> pathSegments (Set.singleton s)
pathSegment = liftDerived . pathSegment
-- ChoosePathSegments :: Set [PathSegment] -> Data PathSegmentable sem [PathSegment]
-- | Initial to final algebra.
-instance (PathSegmentable sem) => Derivable (Data PathSegmentable sem) where
+instance PathSegmentable sem => Derivable (Data PathSegmentable sem) where
derive = \case
PathSegment x -> pathSegment x
-- ChoosePathSegments x -> choosePathSegments x
-- | Final to initial algebra.
-instance (PathSegmentable sem) => PathSegmentable (SomeData sem) where
+instance PathSegmentable sem => PathSegmentable (SomeData sem) where
pathSegment = SomeData . PathSegment
-- pathSegments = SomeData . PathSegments
-- choosePathSegments = SomeData . ChoosePathSegments
-- | Convenient alias for an @index.html@ page.
-index :: (PathSegmentable sem) => sem ()
+index :: PathSegmentable sem => sem ()
index = pathSegment "index.html"
-- | Convenient alias for prefixing with a 'pathSegment'.
(</>) ::
- (ProductFunctor sem) =>
- (PathSegmentable sem) =>
+ ProductFunctor sem =>
+ PathSegmentable sem =>
PathSegment ->
sem a ->
sem a
type Captured a sem = a
capturePathSegment :: PathSegment -> sem (Captured a sem)
default capturePathSegment ::
- (Captured a (Derived sem) ~ Captured a sem) =>
- (FromDerived (Capturable a) sem) =>
+ Captured a (Derived sem) ~ Captured a sem =>
+ FromDerived (Capturable a) sem =>
PathSegment ->
sem (Captured a sem)
capturePathSegment = liftDerived . capturePathSegment @a
-- instance Capturable sem => Capturable (Reader r sem)
data instance Data (Capturable a) sem r where
CapturePathSegment ::
- (Capturable a sem) =>
+ Capturable a sem =>
PathSegment ->
Data (Capturable a) sem (Captured a sem)
-instance (Capturable a sem) => Derivable (Data (Capturable a) sem) where
+instance Capturable a sem => Derivable (Data (Capturable a) sem) where
derive = \case
CapturePathSegment n -> capturePathSegment @a n
instance (Capturable a sem, Typeable a) => Capturable a (SomeData sem) where
class Fileable sem where
type FileableConstraint sem :: Type -> Constraint
static :: sem ()
- dynamic :: (FileableConstraint sem a) => sem a
+ dynamic :: FileableConstraint sem a => sem a
-- * Class 'Responsable'
class Responsable a (ts :: [Type]) (m :: Type -> Type) sem where
-- response :: sem (Responsed a ts m end sem)
response :: sem (Endpoint sem (Response ts m a))
+coding ::
+ forall ts m sem.
+ Monad m =>
+ Voidable sem =>
+ Responsable () ts m sem =>
+ sem ()
+coding = void (Endpoint (Response (return @m ()))) (response @() @ts)
+
-- ** Type 'Response'
newtype Response (ts :: [Type]) m a = Response {unResponse :: m a}
deriving (Functor, Applicative, Monad)
optional :: sem a -> sem (Maybe a)
optional = liftDerived1 optional
default optional ::
- (FromDerived1 (Optionable a) sem) =>
+ FromDerived1 (Optionable a) sem =>
sem a ->
sem (Maybe a)