{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeFamilies #-}
data Tree = Leaf | Fork Tree Tree
type family Branch (t :: Tree) (u :: Tree) :: Tree where
Branch Leaf Leaf = Leaf
Branch Leaf (Fork l r) = Fork (Branch l r) (Branch r l)
Branch (Fork l r) u = Fork (Branch u l) (Branch u r)
type Four = Fork (Fork (Fork Leaf Leaf) (Fork Leaf Leaf)) (Fork (Fork Leaf Leaf) (Fork Leaf Leaf))
class SmthTree (t :: Tree)
instance SmthTree Leaf
instance (SmthTree l, SmthTree r) => SmthTree (Fork l r)
test :: SmthTree (Branch (Branch (Branch Four Four) (Branch Four Four)) (Branch (Branch Four Four) (Branch Four Four))) => ()
test = ()
ey0jIExBTkdVQUdFIERhdGFLaW5kcyAgICAgICAgIy19CnstIyBMQU5HVUFHRSBGbGV4aWJsZUNvbnRleHRzICMtfQp7LSMgTEFOR1VBR0UgS2luZFNpZ25hdHVyZXMgICAjLX0Key0jIExBTkdVQUdFIFR5cGVGYW1pbGllcyAgICAgIy19CgpkYXRhIFRyZWUgPSBMZWFmIHwgRm9yayBUcmVlIFRyZWUKCnR5cGUgZmFtaWx5IEJyYW5jaCAodCA6OiBUcmVlKSAodSA6OiBUcmVlKSA6OiBUcmVlIHdoZXJlCiAgICBCcmFuY2ggTGVhZiAgICAgICBMZWFmICAgICAgID0gTGVhZgogICAgQnJhbmNoIExlYWYgICAgICAgKEZvcmsgbCByKSA9IEZvcmsgKEJyYW5jaCBsIHIpIChCcmFuY2ggciBsKQogICAgQnJhbmNoIChGb3JrIGwgcikgdSAgICAgICAgICA9IEZvcmsgKEJyYW5jaCB1IGwpIChCcmFuY2ggdSByKQoKdHlwZSBGb3VyID0gRm9yayAoRm9yayAoRm9yayBMZWFmIExlYWYpIChGb3JrIExlYWYgTGVhZikpIChGb3JrIChGb3JrIExlYWYgTGVhZikgKEZvcmsgTGVhZiBMZWFmKSkKCmNsYXNzIFNtdGhUcmVlICh0IDo6IFRyZWUpCmluc3RhbmNlIFNtdGhUcmVlIExlYWYKaW5zdGFuY2UgKFNtdGhUcmVlIGwsIFNtdGhUcmVlIHIpID0+IFNtdGhUcmVlIChGb3JrIGwgcikKCnRlc3QgOjogU210aFRyZWUgKEJyYW5jaCAoQnJhbmNoIChCcmFuY2ggRm91ciBGb3VyKSAoQnJhbmNoIEZvdXIgRm91cikpIChCcmFuY2ggKEJyYW5jaCBGb3VyIEZvdXIpIChCcmFuY2ggRm91ciBGb3VyKSkpID0+ICgpCnRlc3QgPSAoKQoKbWFpbiA9IHByaW50ICgp