module Heist.Extra.Splices.List where

import Data.Map.Syntax ((##))
import Heist qualified as H
import Heist.Interpreted qualified as HI

-- | A splice that applies a non-empty list
listSplice :: [a] -> Text -> (a -> H.Splices (HI.Splice Identity)) -> HI.Splice Identity
listSplice :: forall a.
[a] -> Text -> (a -> Splices (Splice Identity)) -> Splice Identity
listSplice [a]
xs Text
childTag a -> Splices (Splice Identity)
childSplice = do
  if [a] -> Bool
forall a. [a] -> Bool
forall (t :: Type -> Type) a. Foldable t => t a -> Bool
null [a]
xs
    then Template -> Splice Identity
forall a. a -> HeistT Identity Identity a
forall (f :: Type -> Type) a. Applicative f => a -> f a
pure Template
forall a. Monoid a => a
mempty
    else Splices (Splice Identity) -> Splice Identity
forall (n :: Type -> Type).
Monad n =>
Splices (Splice n) -> Splice n
HI.runChildrenWith (Splices (Splice Identity) -> Splice Identity)
-> Splices (Splice Identity) -> Splice Identity
forall a b. (a -> b) -> a -> b
$ do
      Text
childTag Text -> Splice Identity -> Splices (Splice Identity)
forall k v. k -> v -> MapSyntax k v
##
        (Splices (Splice Identity) -> Splice Identity
forall (n :: Type -> Type).
Monad n =>
Splices (Splice n) -> Splice n
HI.runChildrenWith (Splices (Splice Identity) -> Splice Identity)
-> (a -> Splices (Splice Identity)) -> a -> Splice Identity
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Splices (Splice Identity)
childSplice)
          (a -> Splice Identity) -> [a] -> Splice Identity
forall b (m :: Type -> Type) (f :: Type -> Type) a.
(Monoid b, Monad m, Foldable f) =>
(a -> m b) -> f a -> m b
`foldMapM` [a]
xs