| 1 | {-# LANGUAGE UndecidableInstances #-} |
|---|
| 2 | {-# LANGUAGE TypeFamilies #-} |
|---|
| 3 | {-# LANGUAGE GADTs #-} |
|---|
| 4 | {-# LANGUAGE MultiParamTypeClasses #-} |
|---|
| 5 | {-# LANGUAGE FlexibleContexts #-} |
|---|
| 6 | |
|---|
| 7 | |
|---|
| 8 | |
|---|
| 9 | data Interval v where |
|---|
| 10 | Intv :: (Ord v, Enum v) => (v,v) -> Interval v |
|---|
| 11 | |
|---|
| 12 | type family Domain (d :: * -> *) :: * -> * |
|---|
| 13 | type instance Domain Interval = Interval |
|---|
| 14 | |
|---|
| 15 | type family Value (d :: * -> *) :: * |
|---|
| 16 | |
|---|
| 17 | |
|---|
| 18 | class IDomain d where |
|---|
| 19 | empty :: (Ord (Value d), Enum (Value d)) => (Domain d) (Value d) |
|---|
| 20 | |
|---|
| 21 | class (Value d1 ~ Value d2) |
|---|
| 22 | => IIDomain d1 d2 where |
|---|
| 23 | equals :: Domain d1 (Value d1) -> Domain d2 (Value d2) -> Bool |
|---|
| 24 | |
|---|
| 25 | |
|---|
| 26 | instance Ord (Value Interval) |
|---|
| 27 | => IDomain Interval where |
|---|
| 28 | empty = Intv (toEnum 1, toEnum 0) |
|---|
| 29 | |
|---|
| 30 | instance Ord (Value Interval) |
|---|
| 31 | => IIDomain Interval Interval where |
|---|
| 32 | equals (Intv ix) (Intv iy) = ix == iy |
|---|