{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE PatternSynonyms #-}

pattern Arrow t1 t2 = App "->" [t1, t2]
pattern Arrow{t1, t2} = App "->" [t1, t2]
pattern Arrow
    { t1
    , t2
    } =
    App "->" [t1, t2]
pattern Int =
    App "Int" []
pattern Maybe{t} =
    App
        "Maybe"
        [t]
pattern Maybe t =
    App
        "Maybe"
        [t]

pattern a :< b <-
    (a, b)
