]> Git — Sourcephile - comptalang.git/blob - lib/Hcompta/Has.hs
Simplify hcompta-lib.
[comptalang.git] / lib / Hcompta / Has.hs
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
10
11 import Data.Proxy (Proxy(..))
12 import GHC.Exts (Constraint)
13
14 -- * Class 'Has'
15 type Has ty a = (Get ty a, Set ty a)
16 -- ** Class 'Get'
17 class Get ty a where
18 get :: a -> ty
19 -- ** Class 'Set'
20 class Set ty a where
21 set :: ty -> a -> a
22
23 -- * Class 'HasI'
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:: *) :: *
29 infixr 9 :@
30
31 -- ** Class 'GetI'
32 class cl (cl:@a) => GetI cl a where
33 getI :: Proxy cl -> a -> cl:@a
34 -- ** Class 'SetI'
35 class cl (cl:@a) => SetI cl a where
36 setI :: Proxy cl -> cl:@a -> a -> a