{-# LANGUAGE TypeFamilies #-}

module Data.Validation.Transforms where

-- | A type that represents a validated type.
data V
-- | A type that represents an unvalidated type, often called a View Model.
data VM

-- | A type that represents a validation transformaion.
-- The unvalidated type is the first parameter which is used when 'VM' is passed in.
-- The second parameter is the validated type which is used when 'V' is passed in.
--
-- ==== __Examples__
--
-- Basic usage:
--
-- @
-- data ThingV v 
--   = Thing 
--   { emailAddress :: VT v String EmailAddress
--   , confirmEmailAddress :: VT v String () 
--   }
-- type ThingVM = ThingV VM -- A `Thing` view model.
-- type Thing = ThingV V    -- A validated `Thing`.
-- @
type family VT v a b where
  VT V a b = b
  VT VM a b = a