{-# LANGUAGE TypeFamilies #-}

module Data.FiberBundle.Trivial
  ( TrivialBundle (..)
  ) where

import Data.FiberBundle
import Data.Group

--------------------------------------------------------------------------------
-- Trivial Bundle

-- | A 'TrivialBundle' is a 'FiberBundle' that is the product of two types. The
-- 'base' function is given by projecting on the first coordinate.
data TrivialBundle b a = TrivialBundle !b !a
  deriving (Show, Eq)

instance FiberBundle (TrivialBundle b a) where
  type Base (TrivialBundle b a) = b
  base (TrivialBundle b _) = b

instance (Eq b, Semigroup a) => SemigroupBundle (TrivialBundle b a) where
  combine (TrivialBundle b1 a1) (TrivialBundle b2 a2) =
      if b1 == b2
        then Just $ TrivialBundle b1 (a1 <> a2)
        else Nothing

instance (Eq b, Monoid a) => MonoidBundle (TrivialBundle b a) where
  unit b = TrivialBundle b mempty

instance (Eq b, Group a) => GroupBundle (TrivialBundle b a) where
  inverse (TrivialBundle b a) = TrivialBundle b (invert a)