module Data.SetLike.Intersection where
import Data.Semigroup
import qualified Data.List.NonEmpty as NE
import Data.List.NonEmpty (NonEmpty(..))
newtype IntersectT s x = IntersectT { getIntersectors :: NonEmpty (s x) }
singleIntersect :: s x -> IntersectT s x
singleIntersect = IntersectT . pure
rmTautologyIntersect ::
(s x -> s x -> Option (s x))
-> IntersectT s x -> IntersectT s x
rmTautologyIntersect smaller (IntersectT isoa) = IntersectT $ rti isoa
where rti (s₀:|ss) = reduce [] ss
where reduce [] [] = s₀:|[]
reduce (sp₀:sp) [] = NE.cons s₀ $ rti (sp₀:|sp)
reduce sp (s₁:sr) = case smaller s₀ s₁ of
Option (Just si) -> rti $ si :| (sp ++ sr)
Option Nothing -> reduce (s₁:sp) sr