{-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-} {-# LANGUAGE ImportQualifiedPost #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} module Main where import Data.Dependent.EnumMap.Strict qualified as DE import Data.Dependent.Sum data Tag = A | B | C deriving (Show) data STag tag where SA :: STag A SB :: STag B SC :: STag C deriving instance Show (STag tag) instance DE.Enum1 STag where type Enum1Info STag = STag fromEnum1 = \case { SA -> (0, SA); SB -> (1, SB); SC -> (2, SC) } toEnum1 n t = case (n, t) of { (0, SA) -> SA; (1, SB) -> SB; (2, SC) -> SC; _ -> error "invalid tag" } data Value tag where VA :: Int -> Value A VB :: Bool -> Value B VC :: String -> Value c deriving instance Show (Value tag) main :: IO () main = do print $ DE.fromList @STag @Value [] print $ DE.fromList [SB :=> VB False, SA :=> VA 3]