{-# LANGUAGE GADTs, DataKinds, PolyKinds, KindSignatures, MultiParamTypeClasses #-}
import Data.Proxy
asIndexOf :: k s -> Proxy s -> k s
asIndexOf x _ = x
data State = A | B | C
data Thing (s :: State) = Thing
class Trans x y where
trans :: Thing x -> Thing y
transThrough :: (Trans y z, Trans x y) => Proxy y -> Thing x -> Thing z
transThrough p t = trans (trans t `asIndexOf` p)
ey0jIExBTkdVQUdFIEdBRFRzLCBEYXRhS2luZHMsIFBvbHlLaW5kcywgS2luZFNpZ25hdHVyZXMsIE11bHRpUGFyYW1UeXBlQ2xhc3NlcyAjLX0KCmltcG9ydCBEYXRhLlByb3h5Cgphc0luZGV4T2YgOjogayBzIC0+IFByb3h5IHMgLT4gayBzCmFzSW5kZXhPZiB4IF8gPSB4CgpkYXRhIFN0YXRlID0gQSB8IEIgfCBDCmRhdGEgVGhpbmcgKHMgOjogU3RhdGUpID0gVGhpbmcKCmNsYXNzIFRyYW5zIHggeSB3aGVyZQoJdHJhbnMgOjogVGhpbmcgeCAtPiBUaGluZyB5Cgp0cmFuc1Rocm91Z2ggOjogKFRyYW5zIHkgeiwgVHJhbnMgeCB5KSA9PiBQcm94eSB5IC0+IFRoaW5nIHggLT4gVGhpbmcgegp0cmFuc1Rocm91Z2ggcCB0ID0gdHJhbnMgKHRyYW5zIHQgYGFzSW5kZXhPZmAgcCkKCm1haW4gPSByZXR1cm4gKCk=