summaryrefslogtreecommitdiff
path: root/src/Text/Hakyll/Resource.hs
diff options
context:
space:
mode:
authorJasper Van der Jeugt <jaspervdj@gmail.com>2010-12-13 20:41:26 +0100
committerJasper Van der Jeugt <jaspervdj@gmail.com>2010-12-13 20:41:26 +0100
commit0da0dd469de6f3c7439099900676deb8a667bbe6 (patch)
tree4f9ccb9ec621ac70591d0bed62176df4d35a54b9 /src/Text/Hakyll/Resource.hs
parent18ec821d02e007dd1a1db983daf504407e70732e (diff)
downloadhakyll-0da0dd469de6f3c7439099900676deb8a667bbe6.tar.gz
Experimental changes for a re-write
Diffstat (limited to 'src/Text/Hakyll/Resource.hs')
-rw-r--r--src/Text/Hakyll/Resource.hs60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/Text/Hakyll/Resource.hs b/src/Text/Hakyll/Resource.hs
new file mode 100644
index 0000000..a8a77b2
--- /dev/null
+++ b/src/Text/Hakyll/Resource.hs
@@ -0,0 +1,60 @@
+-- | A resource represents data for a website
+--
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+module Text.Hakyll.Resource
+ ( Metadata (..)
+ , Resource (..)
+ , getData
+ , getMetadata
+ , getMetadataList
+ ) where
+
+import Data.Monoid (Monoid, mempty, mappend)
+import Control.Applicative (Applicative, (<*>), pure)
+
+-- | Metadata for a resource
+--
+newtype Metadata = Metadata {unMetadata :: [(String, String)]}
+ deriving (Show, Eq, Ord, Monoid)
+
+-- | A resource represents a data source for the website. It contains a value
+-- and a number of metadata fields
+--
+data Resource a = Resource
+ { resourceMetadata :: Metadata
+ , resourceData :: a
+ } deriving (Show, Eq, Ord)
+
+instance Functor Resource where
+ fmap f (Resource m d) = Resource m $ f d
+
+instance Applicative Resource where
+ pure d = Resource mempty d
+ (Resource m1 f) <*> (Resource m2 d) = Resource (mappend m2 m1) (f d)
+
+instance Monad Resource where
+ return d = Resource mempty d
+ (Resource m1 d) >>= f = let Resource m2 d' = f d
+ in Resource (mappend m2 m1) d'
+
+instance Monoid a => Monoid (Resource a) where
+ mempty = Resource mempty mempty
+ mappend (Resource m1 d1) (Resource m2 d2) =
+ Resource (mappend m1 m2) (mappend d1 d2)
+
+-- | Get the data from a resource
+--
+getData :: Resource a -> a
+getData = resourceData
+
+-- | Get a metadata field from a resource
+--
+getMetadata :: String -> Resource a -> Maybe String
+getMetadata k (Resource m _) = lookup k $ unMetadata m
+
+-- | Get a metadata field from a resource. If multiple fields with the same name
+-- exist, they will all be returned
+--
+getMetadataList :: String -> Resource a -> [String]
+getMetadataList k = map snd . filter ((== k) . fst)
+ . unMetadata . resourceMetadata