This is probably an ok use for a GADT. Something like:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
data Bap = Baptized | Unbaptized
data Person :: Bap -> * where
Baptize :: Person Unbaptized -> Person Baptized
NewPerson :: Person Unbaptized
conditionalBaptize :: Person a -> Person Baptized
conditionalBaptize p =
case p of NewPerson -> Baptize p
Baptize _ -> p
main = return ()
This is probably an ok use for a GADT. Something like:
Thank you for refactoring baptism. How do we push this to production now?