]> Git — Sourcephile - haskell/literate-web.git/commitdiff
fix(addresser): support extensions main
authorJulien Moutinho <julm+literate-web@sourcephile.fr>
Thu, 28 Nov 2024 01:06:58 +0000 (02:06 +0100)
committerJulien Moutinho <julm+literate-web@sourcephile.fr>
Thu, 28 Nov 2024 01:06:58 +0000 (02:06 +0100)
src/Literate/Web/Semantics/Addresser.hs
tests/Examples/Ex03.hs

index 7876b2e8f7b07a1fbe0f2b7b7188e88c17357197..19ea7283dedb2d126d93eea603409cf50f34bbd8 100644 (file)
@@ -6,14 +6,20 @@
 module Literate.Web.Semantics.Addresser where
 
 import Data.Bool
+import Data.Eq (Eq)
 import Data.Function (id, ($), (.))
+import Data.Functor ((<$>))
+import Data.List qualified as List
 import Data.Maybe (Maybe (..))
 import Data.Monoid (Monoid (..))
+import Data.Ord (Ord)
 import Data.Semigroup (Semigroup (..))
+import Data.Text qualified as Text
 import GHC.Generics (Generic)
 import Literate.Web.Syntaxes
 import Literate.Web.Types.URL
 import Symantic qualified as Sym
+import System.FilePath qualified as Sys
 import Text.Show (Show (..))
 
 -- * Type 'Addresser'
@@ -29,15 +35,15 @@ type instance ToFEndpoint Addresser a next = next
 address :: Addresser a -> a --> Address
 address router = unAddresser router id
 
-instance PathSegmentable (Addresser) where
-  pathSegment s = Addresser \f -> f Address{addressPath = [s]}
+instance PathSegmentable Addresser where
+  pathSegment s = Addresser \f -> f Address{addressSegs = [s], addressExts = []}
 
 instance Sym.SumFunctor Addresser where
   a <+> b = Addresser \n -> (unAddresser a n, unAddresser b n)
 instance Sym.ProductFunctor Addresser where
-  a <.> b = Addresser \k -> unAddresser a \aA -> unAddresser b \bA -> k (bA <> aA)
-  a <. b = Addresser \k -> unAddresser a \aA -> unAddresser b \bA -> k (bA <> aA)
-  a .> b = Addresser \k -> unAddresser a \aA -> unAddresser b \bA -> k (bA <> aA)
+  a <.> b = Addresser \k -> unAddresser a \aA -> unAddresser b \bA -> k (aA <> bA)
+  a <. b = Addresser \k -> unAddresser a \aA -> unAddresser b \bA -> k (aA <> bA)
+  a .> b = Addresser \k -> unAddresser a \aA -> unAddresser b \bA -> k (aA <> bA)
 instance
   ( Generic a
   , Sym.EoTOfRep a
@@ -50,20 +56,31 @@ instance
   where
   -- dataType :: sem (Sym.EoT (Sym.ADT a)) -> sem a
   dataType a = Addresser (\a2n -> Sym.funOftof (unAddresser a a2n) . Sym.eotOfadt)
-instance (Sym.IsToF a ~ 'False) => Optionable a Addresser where
+instance Sym.IsToF a ~ 'False => Optionable a Addresser where
   optional aA = Addresser \k -> \case
     Nothing -> k mempty
     Just a -> unAddresser aA k a
 
-instance (end ~ Address) => Responsable a ts m (Addresser) where
+instance end ~ Address => Responsable a ts m (Addresser) where
   response = Addresser ($ mempty)
 
 -- ** Type 'Address'
-newtype Address = Address
-  { addressPath :: [PathSegment]
+data Address = Address
+  { addressSegs :: [PathSegment]
+  , addressExts :: [PathSegment]
   }
-  deriving (Show)
-instance Semigroup (Address) where
-  Address a <> Address b = Address (a <> b)
-instance Monoid (Address) where
-  mempty = Address []
+  deriving (Eq, Ord, Show)
+instance Semigroup Address where
+  x <> y =
+    Address
+      { addressSegs = addressSegs x <> addressSegs y
+      , addressExts = addressExts x <> addressExts y
+      }
+instance Monoid Address where
+  mempty = Address{addressSegs = [], addressExts = []}
+
+addressFile :: Address -> Sys.FilePath
+addressFile addr =
+  List.intercalate "." $
+    encodePath (addressSegs addr)
+      : (Text.unpack . encodePathSegment <$> addressExts addr)
index 11006cda08f4ef74b14ec66c9e73e7b0910ac947..d9990970d6c4a2dbf8a9c33ccf17f47223ffbf6a 100644 (file)
@@ -95,7 +95,8 @@ instance MC.MonadReader Model m => Capturable Tag (Compiler m) where
 
 instance Capturable Tag Addresser where
   -- FIXME: check given tag exists?
-  capturePathSegment _n = Addresser \k t -> k (Address [unTag t])
+  capturePathSegment _n = Addresser \k t ->
+    k Address{addressSegs = [unTag t], addressExts = []}
 
 -- * Type 'Model'
 data Model = Model