{-# OPTIONS --without-K --safe #-}

module Examples where

open import Level using (Level; _⊔_)
open import StateOfTheArt as SOA
  hiding ( ∃⟨_⟩; ∀[_]; Π[_]; _⇒_; _∩_; ¬_
         ; _<⋆>_
         )

private
  variable
    a b r s p : Level
    A : Set a
    B : Set b
    R : A  B  Set r
    S : A  B  Set s

------------------------------------------------------------------------
-- Introduction
------------------------------------------------------------------------

-- Data.Product.N-ary.Heterogeneous provides a generic representation of
-- n-ary heterogeneous (non dependent) products and the corresponding types
-- of (non-dependent) n-ary functions. The representation works well with
-- inference thus allowing us to use generic combinators to manipulate
-- such functions.

open import N-ary

------------------------------------------------------------------------
-- Examples of Arrows n As B
------------------------------------------------------------------------

module _ {a} {A : Set a} where

  _ : Arrows 2 ((A  Set p) , List A , _) (Set (p  a))
  _ = All

_<⋆>_ : ∀[ Pw (R  S)  Pw R  Pw S ]

[]        <⋆> []        = []
(f  fs)  <⋆> (x  xs)  = (f x)  (fs <⋆> xs)