Saved! You can share or revisit your program with this link:

The URL bar of your browser has also been updated to this link.

Toolbar controls:

Drop-down menus:

Tips and tricks:

import Data.Constraint (Dict(..), withDict)
import qualified Data.ByteString as BS
data DBEntry = DBEntry { siteVariant :: SiteVariant
, html :: BS.ByteString
}
data SiteVariant = A | B
data SiteA = SiteA
data SiteB = SiteB
-- | all sites to be transformed into General
data General = General
class IntoGeneral a where
fromHTML :: Dict (IntoGeneral a) -> BS.ByteString -> General
instance IntoGeneral SiteA where
fromHTML _ = undefined
-- | Depending on `siteVariant` in `DBEntry`, `fromHTML` is calibrated with Proxy
fromDBEntry :: Dict (IntoGeneral a) -> DBEntry -> General
fromDBEntry dict (DBEntry siteVariant html) = case siteVariant of
A -> withDict dict (@SiteA) $ fromHTML html
B -> withDict dict SiteB $ fromHTML html
-- Question: how to make fromDBEntry work?
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX