{-# LANGUAGE CPP #-}
{-# LANGUAGE PackageImports #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.Universe.DependentSum () where
import Data.Universe.Class (Universe (..), Finite (..))
import Data.Universe.Some (UniverseSome (..), FiniteSome (..))
import Data.Universe.Helpers (Tagged (..), Natural, (+++))
import "some" Data.Some (Some (..), foldSome)
import qualified "dependent-sum" Data.Some as DS
#if MIN_VERSION_dependent_sum(0,5,0)
mkSome :: f a -> DS.Some f
mkSome = DS.Some
#else
mkSome :: f a -> DS.Some f
mkSome = DS.This
#endif
instance UniverseSome f => Universe (DS.Some f) where
universe = map (foldSome mkSome) universeSome
instance FiniteSome f => Finite (DS.Some f) where
universeF = map (foldSome mkSome) universeFSome
cardinality = retagSome cardinalitySome
retagSome :: Tagged (Some f) Natural -> Tagged (some f) Natural
retagSome (Tagged n) = Tagged n