{-# 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.EnumMap.Strict.Internal (coe1) import Data.Dependent.Sum import Data.Functor.Const 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 = Const () fromEnum1 = \case SA -> (0, Const ()) SB -> (1, Const ()) SC -> (2, Const ()) toEnum1 n _ = case n of 0 -> coe1 SA 1 -> coe1 SB 2 -> coe1 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]