{-# OPTIONS_GHC -Wno-orphans #-}

module Data.SegTree.RangeUpdateRangeMin where

import Data.Coerce
import Data.Monoid.LastMin
import Data.SegTree
import Data.Semigroup

instance
  (Ord a, Bounded a) =>
  AsSemigroupEndo (Dual (LastMin a)) (Min a)
  where
  sendo :: Dual (LastMin a) -> Min a -> Min a
sendo Dual (LastMin a)
x Min a
y
    | Dual (LastMin a)
x Dual (LastMin a) -> Dual (LastMin a) -> Bool
forall a. Eq a => a -> a -> Bool
== Dual (LastMin a)
forall a. Monoid a => a
mempty = Min a
y
    | Bool
otherwise = Dual (LastMin a) -> Min a
forall a b. Coercible a b => a -> b
coerce Dual (LastMin a)
x
  {-# INLINE sendo #-}