-- Testing parameterised records in parameterised modules

module Exist (X : Set) where

data [_] (a : Set) : Set where
  []  : [ a ]
  _∷_ : a -> [ a ] -> [ a ]

map : forall {a b} -> (a -> b) -> [ a ] -> [ b ]
map f []       = []
map f (x ∷ xs) = f x ∷ map f xs

record ∃ (a : Set) (P : a -> Set) : Set where
  field
    witness : a
    proof   : P witness

ListP : (a : Set) -> (a -> Set) -> Set
ListP a P = [ ∃ a P ]

mapP : forall {a b P Q}
  -> (f : a -> b) -> (forall {x} -> P x -> Q (f x))
  -> ListP a P -> ListP b Q
mapP {a} {b} {P} {Q} f pres xs = map helper xs
  where
  helper : ∃ a P -> ∃ b Q
  helper r = record { witness = f (∃.witness r)
                    ; proof   = pres (∃.proof r)
                    }
