{-| Module : StrictUnit Description : Strict unit type Copyright : (c) Eric Mertens, 2016 License : ISC Maintainer : emertens@gmail.com This module provides a unit type where the 'Monoid' and 'Semigroup' instances are strict in their append operations. This is a helper module for "LensUtils". -} module StrictUnit ( StrictUnit(..) ) where import Data.Semigroup -- | Unit data type with a strict 'Semigroup' and 'Monoid' instances. data StrictUnit = StrictUnit -- | '<>' is strict, 'stimes' is /O(1)/ instance Semigroup StrictUnit where (<>) = seq stimes = stimesIdempotent -- | 'mappend' is strict instance Monoid StrictUnit where mempty = StrictUnit mappend = (<>)