1 {-# LANGUAGE ConstraintKinds #-}
2 {-# LANGUAGE FlexibleContexts #-}
3 {-# LANGUAGE FlexibleInstances #-}
4 {-# LANGUAGE MultiParamTypeClasses #-}
5 {-# LANGUAGE TypeFamilies #-}
6 {-# LANGUAGE TypeOperators #-}
7 {-# LANGUAGE UndecidableSuperClasses #-}
8 {-# LANGUAGE UndecidableInstances #-}
9 module Hcompta.Has where
11 import Data.Proxy (Proxy(..))
12 import GHC.Exts (Constraint)
15 type Has ty a = (Get ty a, Set ty a)
24 type HasI cl a = (GetI cl a, SetI cl a)
25 -- ** Type family ':@'
26 -- | Return the type associated with @cl@ and @a@,
27 -- and which is an instance of @cl (cl :@ a)@.
28 type family (:@) (cl:: * -> Constraint) (a:: *) :: *
32 class cl (cl:@a) => GetI cl a where
33 getI :: Proxy cl -> a -> cl:@a
35 class cl (cl:@a) => SetI cl a where
36 setI :: Proxy cl -> cl:@a -> a -> a