packages feed

fresnel-0.0.0.0: src/Fresnel/Functor/Traversed.hs

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Fresnel.Functor.Traversed
( -- * Traversed functor
  runTraversed
, Traversed(..)
) where

import Data.Functor (void)

-- Traversed functor

runTraversed :: Functor f => Traversed f a -> f ()
runTraversed (Traversed fa) = void fa

newtype Traversed f a = Traversed (f a)
  deriving (Applicative, Functor)

instance Applicative f => Semigroup (Traversed f a) where
  Traversed a1 <> Traversed a2 = Traversed (a1 *> a2)

instance Applicative f => Monoid (Traversed f a) where
  mempty = Traversed (pure (error "Traversed.mempty: value used"))