diff options
author | Jasper Van der Jeugt <jaspervdj@gmail.com> | 2010-12-13 20:41:26 +0100 |
---|---|---|
committer | Jasper Van der Jeugt <jaspervdj@gmail.com> | 2010-12-13 20:41:26 +0100 |
commit | 0da0dd469de6f3c7439099900676deb8a667bbe6 (patch) | |
tree | 4f9ccb9ec621ac70591d0bed62176df4d35a54b9 /src/Text/Hakyll/Resource.hs | |
parent | 18ec821d02e007dd1a1db983daf504407e70732e (diff) | |
download | hakyll-0da0dd469de6f3c7439099900676deb8a667bbe6.tar.gz |
Experimental changes for a re-write
Diffstat (limited to 'src/Text/Hakyll/Resource.hs')
-rw-r--r-- | src/Text/Hakyll/Resource.hs | 60 |
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 |