summaryrefslogtreecommitdiff
path: root/testsuite/tests/backpack/should_compile/bkp40.bkp
blob: 3f9745668614debcb09e86bfdea33c8f90d6ca88 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RoleAnnotations #-}
unit user where
    signature Map where
        type role Map nominal representational
        data Map k a
        class Key k
        instance Key String
        empty  :: Map k a
        lookup :: Key k => k -> Map k a -> Maybe a
        insert :: Key k => k -> a -> Map k a -> Map k a
    module User where
        import Prelude hiding (lookup)
        import Map
        x = lookup "foo" (insert "foo" True empty)
unit ordmap where
    module Map(module Data.Map, Key) where
        import Data.Map
        type Key = Ord
unit eqmap where
    module Map where
        import Prelude hiding (lookup)
        import qualified Prelude
        type role Map nominal representational
        newtype Map k a = Assoc [(k, a)]
        type Key = Eq
        -- Ugh, need the type signatures, otherwise the quantifiers
        -- are put in the wrong order.  See #12441
        empty :: Map k a
        empty = Assoc []
        lookup :: Eq k => k -> Map k a -> Maybe a
        lookup k (Assoc xs) = Prelude.lookup k xs
        -- Need to insert redundant constraint to make it work...
        insert :: Eq k => k -> a -> Map k a -> Map k a
        insert k v (Assoc xs) = Assoc ((k,v):xs)
unit main where
    dependency user[Map=ordmap:Map] (User as User.Ord)
    dependency user[Map=eqmap:Map] (User as User.Eq)