{-# LANGUAGE DeriveFoldable    #-}
{-# LANGUAGE DeriveFunctor     #-}
{-# LANGUAGE DeriveTraversable #-}
{-# LANGUAGE DeriveGeneric #-}

module Blagda.Types where

import Data.Bifunctor
import Data.Aeson
import GHC.Generics (Generic)

data Post contents meta = Post
  { Post contents meta -> FilePath
p_path :: FilePath
  , Post contents meta -> contents
p_contents :: contents
  , Post contents meta -> meta
p_meta :: meta
  }
  deriving (Post contents meta -> Post contents meta -> Bool
(Post contents meta -> Post contents meta -> Bool)
-> (Post contents meta -> Post contents meta -> Bool)
-> Eq (Post contents meta)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall contents meta.
(Eq contents, Eq meta) =>
Post contents meta -> Post contents meta -> Bool
/= :: Post contents meta -> Post contents meta -> Bool
$c/= :: forall contents meta.
(Eq contents, Eq meta) =>
Post contents meta -> Post contents meta -> Bool
== :: Post contents meta -> Post contents meta -> Bool
$c== :: forall contents meta.
(Eq contents, Eq meta) =>
Post contents meta -> Post contents meta -> Bool
Eq, Eq (Post contents meta)
Eq (Post contents meta)
-> (Post contents meta -> Post contents meta -> Ordering)
-> (Post contents meta -> Post contents meta -> Bool)
-> (Post contents meta -> Post contents meta -> Bool)
-> (Post contents meta -> Post contents meta -> Bool)
-> (Post contents meta -> Post contents meta -> Bool)
-> (Post contents meta -> Post contents meta -> Post contents meta)
-> (Post contents meta -> Post contents meta -> Post contents meta)
-> Ord (Post contents meta)
Post contents meta -> Post contents meta -> Bool
Post contents meta -> Post contents meta -> Ordering
Post contents meta -> Post contents meta -> Post contents meta
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall contents meta.
(Ord contents, Ord meta) =>
Eq (Post contents meta)
forall contents meta.
(Ord contents, Ord meta) =>
Post contents meta -> Post contents meta -> Bool
forall contents meta.
(Ord contents, Ord meta) =>
Post contents meta -> Post contents meta -> Ordering
forall contents meta.
(Ord contents, Ord meta) =>
Post contents meta -> Post contents meta -> Post contents meta
min :: Post contents meta -> Post contents meta -> Post contents meta
$cmin :: forall contents meta.
(Ord contents, Ord meta) =>
Post contents meta -> Post contents meta -> Post contents meta
max :: Post contents meta -> Post contents meta -> Post contents meta
$cmax :: forall contents meta.
(Ord contents, Ord meta) =>
Post contents meta -> Post contents meta -> Post contents meta
>= :: Post contents meta -> Post contents meta -> Bool
$c>= :: forall contents meta.
(Ord contents, Ord meta) =>
Post contents meta -> Post contents meta -> Bool
> :: Post contents meta -> Post contents meta -> Bool
$c> :: forall contents meta.
(Ord contents, Ord meta) =>
Post contents meta -> Post contents meta -> Bool
<= :: Post contents meta -> Post contents meta -> Bool
$c<= :: forall contents meta.
(Ord contents, Ord meta) =>
Post contents meta -> Post contents meta -> Bool
< :: Post contents meta -> Post contents meta -> Bool
$c< :: forall contents meta.
(Ord contents, Ord meta) =>
Post contents meta -> Post contents meta -> Bool
compare :: Post contents meta -> Post contents meta -> Ordering
$ccompare :: forall contents meta.
(Ord contents, Ord meta) =>
Post contents meta -> Post contents meta -> Ordering
$cp1Ord :: forall contents meta.
(Ord contents, Ord meta) =>
Eq (Post contents meta)
Ord, Int -> Post contents meta -> ShowS
[Post contents meta] -> ShowS
Post contents meta -> FilePath
(Int -> Post contents meta -> ShowS)
-> (Post contents meta -> FilePath)
-> ([Post contents meta] -> ShowS)
-> Show (Post contents meta)
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
forall contents meta.
(Show contents, Show meta) =>
Int -> Post contents meta -> ShowS
forall contents meta.
(Show contents, Show meta) =>
[Post contents meta] -> ShowS
forall contents meta.
(Show contents, Show meta) =>
Post contents meta -> FilePath
showList :: [Post contents meta] -> ShowS
$cshowList :: forall contents meta.
(Show contents, Show meta) =>
[Post contents meta] -> ShowS
show :: Post contents meta -> FilePath
$cshow :: forall contents meta.
(Show contents, Show meta) =>
Post contents meta -> FilePath
showsPrec :: Int -> Post contents meta -> ShowS
$cshowsPrec :: forall contents meta.
(Show contents, Show meta) =>
Int -> Post contents meta -> ShowS
Show, a -> Post contents b -> Post contents a
(a -> b) -> Post contents a -> Post contents b
(forall a b. (a -> b) -> Post contents a -> Post contents b)
-> (forall a b. a -> Post contents b -> Post contents a)
-> Functor (Post contents)
forall a b. a -> Post contents b -> Post contents a
forall a b. (a -> b) -> Post contents a -> Post contents b
forall contents a b. a -> Post contents b -> Post contents a
forall contents a b. (a -> b) -> Post contents a -> Post contents b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> Post contents b -> Post contents a
$c<$ :: forall contents a b. a -> Post contents b -> Post contents a
fmap :: (a -> b) -> Post contents a -> Post contents b
$cfmap :: forall contents a b. (a -> b) -> Post contents a -> Post contents b
Functor, Post contents a -> Bool
(a -> m) -> Post contents a -> m
(a -> b -> b) -> b -> Post contents a -> b
(forall m. Monoid m => Post contents m -> m)
-> (forall m a. Monoid m => (a -> m) -> Post contents a -> m)
-> (forall m a. Monoid m => (a -> m) -> Post contents a -> m)
-> (forall a b. (a -> b -> b) -> b -> Post contents a -> b)
-> (forall a b. (a -> b -> b) -> b -> Post contents a -> b)
-> (forall b a. (b -> a -> b) -> b -> Post contents a -> b)
-> (forall b a. (b -> a -> b) -> b -> Post contents a -> b)
-> (forall a. (a -> a -> a) -> Post contents a -> a)
-> (forall a. (a -> a -> a) -> Post contents a -> a)
-> (forall a. Post contents a -> [a])
-> (forall a. Post contents a -> Bool)
-> (forall a. Post contents a -> Int)
-> (forall a. Eq a => a -> Post contents a -> Bool)
-> (forall a. Ord a => Post contents a -> a)
-> (forall a. Ord a => Post contents a -> a)
-> (forall a. Num a => Post contents a -> a)
-> (forall a. Num a => Post contents a -> a)
-> Foldable (Post contents)
forall a. Eq a => a -> Post contents a -> Bool
forall a. Num a => Post contents a -> a
forall a. Ord a => Post contents a -> a
forall m. Monoid m => Post contents m -> m
forall a. Post contents a -> Bool
forall a. Post contents a -> Int
forall a. Post contents a -> [a]
forall a. (a -> a -> a) -> Post contents a -> a
forall contents a. Eq a => a -> Post contents a -> Bool
forall contents a. Num a => Post contents a -> a
forall contents a. Ord a => Post contents a -> a
forall m a. Monoid m => (a -> m) -> Post contents a -> m
forall contents m. Monoid m => Post contents m -> m
forall contents a. Post contents a -> Bool
forall contents a. Post contents a -> Int
forall contents a. Post contents a -> [a]
forall b a. (b -> a -> b) -> b -> Post contents a -> b
forall a b. (a -> b -> b) -> b -> Post contents a -> b
forall contents a. (a -> a -> a) -> Post contents a -> a
forall contents m a. Monoid m => (a -> m) -> Post contents a -> m
forall contents b a. (b -> a -> b) -> b -> Post contents a -> b
forall contents a b. (a -> b -> b) -> b -> Post contents a -> b
forall (t :: * -> *).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
product :: Post contents a -> a
$cproduct :: forall contents a. Num a => Post contents a -> a
sum :: Post contents a -> a
$csum :: forall contents a. Num a => Post contents a -> a
minimum :: Post contents a -> a
$cminimum :: forall contents a. Ord a => Post contents a -> a
maximum :: Post contents a -> a
$cmaximum :: forall contents a. Ord a => Post contents a -> a
elem :: a -> Post contents a -> Bool
$celem :: forall contents a. Eq a => a -> Post contents a -> Bool
length :: Post contents a -> Int
$clength :: forall contents a. Post contents a -> Int
null :: Post contents a -> Bool
$cnull :: forall contents a. Post contents a -> Bool
toList :: Post contents a -> [a]
$ctoList :: forall contents a. Post contents a -> [a]
foldl1 :: (a -> a -> a) -> Post contents a -> a
$cfoldl1 :: forall contents a. (a -> a -> a) -> Post contents a -> a
foldr1 :: (a -> a -> a) -> Post contents a -> a
$cfoldr1 :: forall contents a. (a -> a -> a) -> Post contents a -> a
foldl' :: (b -> a -> b) -> b -> Post contents a -> b
$cfoldl' :: forall contents b a. (b -> a -> b) -> b -> Post contents a -> b
foldl :: (b -> a -> b) -> b -> Post contents a -> b
$cfoldl :: forall contents b a. (b -> a -> b) -> b -> Post contents a -> b
foldr' :: (a -> b -> b) -> b -> Post contents a -> b
$cfoldr' :: forall contents a b. (a -> b -> b) -> b -> Post contents a -> b
foldr :: (a -> b -> b) -> b -> Post contents a -> b
$cfoldr :: forall contents a b. (a -> b -> b) -> b -> Post contents a -> b
foldMap' :: (a -> m) -> Post contents a -> m
$cfoldMap' :: forall contents m a. Monoid m => (a -> m) -> Post contents a -> m
foldMap :: (a -> m) -> Post contents a -> m
$cfoldMap :: forall contents m a. Monoid m => (a -> m) -> Post contents a -> m
fold :: Post contents m -> m
$cfold :: forall contents m. Monoid m => Post contents m -> m
Foldable, Functor (Post contents)
Foldable (Post contents)
Functor (Post contents)
-> Foldable (Post contents)
-> (forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> Post contents a -> f (Post contents b))
-> (forall (f :: * -> *) a.
    Applicative f =>
    Post contents (f a) -> f (Post contents a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> Post contents a -> m (Post contents b))
-> (forall (m :: * -> *) a.
    Monad m =>
    Post contents (m a) -> m (Post contents a))
-> Traversable (Post contents)
(a -> f b) -> Post contents a -> f (Post contents b)
forall contents. Functor (Post contents)
forall contents. Foldable (Post contents)
forall contents (m :: * -> *) a.
Monad m =>
Post contents (m a) -> m (Post contents a)
forall contents (f :: * -> *) a.
Applicative f =>
Post contents (f a) -> f (Post contents a)
forall contents (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Post contents a -> m (Post contents b)
forall contents (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Post contents a -> f (Post contents b)
forall (t :: * -> *).
Functor t
-> Foldable t
-> (forall (f :: * -> *) a b.
    Applicative f =>
    (a -> f b) -> t a -> f (t b))
-> (forall (f :: * -> *) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: * -> *) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: * -> *) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (m :: * -> *) a.
Monad m =>
Post contents (m a) -> m (Post contents a)
forall (f :: * -> *) a.
Applicative f =>
Post contents (f a) -> f (Post contents a)
forall (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Post contents a -> m (Post contents b)
forall (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Post contents a -> f (Post contents b)
sequence :: Post contents (m a) -> m (Post contents a)
$csequence :: forall contents (m :: * -> *) a.
Monad m =>
Post contents (m a) -> m (Post contents a)
mapM :: (a -> m b) -> Post contents a -> m (Post contents b)
$cmapM :: forall contents (m :: * -> *) a b.
Monad m =>
(a -> m b) -> Post contents a -> m (Post contents b)
sequenceA :: Post contents (f a) -> f (Post contents a)
$csequenceA :: forall contents (f :: * -> *) a.
Applicative f =>
Post contents (f a) -> f (Post contents a)
traverse :: (a -> f b) -> Post contents a -> f (Post contents b)
$ctraverse :: forall contents (f :: * -> *) a b.
Applicative f =>
(a -> f b) -> Post contents a -> f (Post contents b)
$cp2Traversable :: forall contents. Foldable (Post contents)
$cp1Traversable :: forall contents. Functor (Post contents)
Traversable, (forall x. Post contents meta -> Rep (Post contents meta) x)
-> (forall x. Rep (Post contents meta) x -> Post contents meta)
-> Generic (Post contents meta)
forall x. Rep (Post contents meta) x -> Post contents meta
forall x. Post contents meta -> Rep (Post contents meta) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall contents meta x.
Rep (Post contents meta) x -> Post contents meta
forall contents meta x.
Post contents meta -> Rep (Post contents meta) x
$cto :: forall contents meta x.
Rep (Post contents meta) x -> Post contents meta
$cfrom :: forall contents meta x.
Post contents meta -> Rep (Post contents meta) x
Generic)

instance (ToJSON contents, ToJSON meta) => ToJSON (Post contents meta) where
  toJSON :: Post contents meta -> Value
toJSON = Options -> Post contents meta -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
genericToJSON Options
defaultOptions { fieldLabelModifier :: ShowS
fieldLabelModifier = Int -> ShowS
forall a. Int -> [a] -> [a]
drop Int
2 }

instance Bifunctor Post where
  bimap :: (a -> b) -> (c -> d) -> Post a c -> Post b d
bimap a -> b
fab c -> d
fcd (Post FilePath
s a
a c
c)
    = Post :: forall contents meta.
FilePath -> contents -> meta -> Post contents meta
Post {p_path :: FilePath
p_path = FilePath
s, p_contents :: b
p_contents = a -> b
fab a
a, p_meta :: d
p_meta = c -> d
fcd c
c}