{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE StandaloneDeriving #-}

-- | --   Module    : Media.VF
--   License   : MIT
--   Stability : experimental
--
-- Simple Variable Media Type
module Media.VF
  ( VF (..),
    VFC (..),
  )
where

import Data.Text
import GHC.Generics

-- | Variable Media Field, specify `u` to
-- determine where media will be sourced.
--
-- @since 0.1.0.0
data VF u where
  Blank :: VF u
  RawText :: Text -> VF u
  Image :: u -> VF u
  Audio :: u -> VF u
  Video :: u -> VF u

deriving stock instance Eq u => Eq (VF u)

deriving stock instance Functor VF

deriving stock instance Generic (VF u)

deriving stock instance Show u => Show (VF u)

-- | Variable Media Field Collection
--
-- @since 0.1.0.0
newtype VFC u = VFC {VFC u -> [VF u]
unVFC :: [VF u]}
  deriving stock (VFC u -> VFC u -> Bool
(VFC u -> VFC u -> Bool) -> (VFC u -> VFC u -> Bool) -> Eq (VFC u)
forall u. Eq u => VFC u -> VFC u -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: VFC u -> VFC u -> Bool
$c/= :: forall u. Eq u => VFC u -> VFC u -> Bool
== :: VFC u -> VFC u -> Bool
$c== :: forall u. Eq u => VFC u -> VFC u -> Bool
Eq, Int -> VFC u -> ShowS
[VFC u] -> ShowS
VFC u -> String
(Int -> VFC u -> ShowS)
-> (VFC u -> String) -> ([VFC u] -> ShowS) -> Show (VFC u)
forall u. Show u => Int -> VFC u -> ShowS
forall u. Show u => [VFC u] -> ShowS
forall u. Show u => VFC u -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [VFC u] -> ShowS
$cshowList :: forall u. Show u => [VFC u] -> ShowS
show :: VFC u -> String
$cshow :: forall u. Show u => VFC u -> String
showsPrec :: Int -> VFC u -> ShowS
$cshowsPrec :: forall u. Show u => Int -> VFC u -> ShowS
Show, (forall x. VFC u -> Rep (VFC u) x)
-> (forall x. Rep (VFC u) x -> VFC u) -> Generic (VFC u)
forall x. Rep (VFC u) x -> VFC u
forall x. VFC u -> Rep (VFC u) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall u x. Rep (VFC u) x -> VFC u
forall u x. VFC u -> Rep (VFC u) x
$cto :: forall u x. Rep (VFC u) x -> VFC u
$cfrom :: forall u x. VFC u -> Rep (VFC u) x
Generic, a -> VFC b -> VFC a
(a -> b) -> VFC a -> VFC b
(forall a b. (a -> b) -> VFC a -> VFC b)
-> (forall a b. a -> VFC b -> VFC a) -> Functor VFC
forall a b. a -> VFC b -> VFC a
forall a b. (a -> b) -> VFC a -> VFC b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> VFC b -> VFC a
$c<$ :: forall a b. a -> VFC b -> VFC a
fmap :: (a -> b) -> VFC a -> VFC b
$cfmap :: forall a b. (a -> b) -> VFC a -> VFC b
Functor)