{-# language LambdaCase #-}

module Rel8.Type.Builder.Fold (
  interfoldMap
) where

-- base
import Prelude


interfoldMap :: (Foldable t, Monoid m) => m -> (a -> m) -> t a -> m
interfoldMap :: forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
m -> (a -> m) -> t a -> m
interfoldMap m
sep a -> m
f = m -> (m -> m) -> Maybe m -> m
forall b a. b -> (a -> b) -> Maybe a -> b
maybe m
forall a. Monoid a => a
mempty m -> m
forall a. a -> a
id (Maybe m -> m) -> (t a -> Maybe m) -> t a -> m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Maybe m -> Maybe m) -> Maybe m -> t a -> Maybe m
forall a b. (a -> b -> b) -> b -> t a -> b
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr a -> Maybe m -> Maybe m
go Maybe m
forall a. Maybe a
Nothing
  where
    go :: a -> Maybe m -> Maybe m
go a
x = \case
      Maybe m
Nothing -> m -> Maybe m
forall a. a -> Maybe a
Just (a -> m
f a
x)
      Just m
acc -> m -> Maybe m
forall a. a -> Maybe a
Just (a -> m
f a
x m -> m -> m
forall a. Semigroup a => a -> a -> a
<> m
sep m -> m -> m
forall a. Semigroup a => a -> a -> a
<> m
acc)