{-# OPTIONS --without-K --safe #-}
module Prelude.Sigma where

open import Prelude.Level

open import Agda.Builtin.Sigma public
  hiding (module Σ)
module Σ = Agda.Builtin.Sigma.Σ

private variable
  A B C : Set _

infix 2 Σ-syntax

Σ-syntax :  {a b}
   (A : Set a)  (A  Set b)  Set _
Σ-syntax = Σ

syntax Σ-syntax A  x  B) = Σ[ x  A ] B

infixr 2 _×_

_×_ :  {a b}
   (A : Set a) (B : Set b)  Set _
A × B = Σ[ _  A ] B

<_,_> : {B : A  Set } {C : {x : A}  B x  Set ℓ'}
        (f : (x : A)  B x)  ((x : A)  C (f x)) 
        ((x : A)  Σ (B x) C)
< f , g > x = (f x , g x)

bimap :  {} {P : A  Set } {ℓ′} {Q : B  Set ℓ′} 
      (f : A  B)  (∀ {x}  P x  Q (f x)) 
      Σ A P  Σ B Q
bimap f g (x , y) = (f x , g y)

curry :  {ℓᵃ} {A : Set ℓᵃ} {ℓᵇ} {B : A  Set ℓᵇ} {ℓᶜ} {C : Σ A B  Set ℓᶜ} 
        ((p : Σ A B)  C p) 
        ((x : A)  (y : B x)  C (x , y))
curry f x y = f (x , y)

uncurry :  {ℓᵃ} {A : Set ℓᵃ} {ℓᵇ} {B : A  Set ℓᵇ} {ℓᶜ} {C : Σ A B  Set ℓᶜ} 
          ((x : A)  (y : B x)  C (x , y)) 
          ((p : Σ A B)  C p)
uncurry f (x , y) = f x y

infixr 4 _,ω_

record Σω {a} (A : Set a) (B : A  Setω) : Setω where
  constructor _,ω_
  field
    fstω : A
    sndω : B fstω

open Σω public

infix 2 Σω-syntax

Σω-syntax :  {a} (A : Set a)  (A  Setω)  Setω
Σω-syntax = Σω

syntax Σω-syntax A  x  B) = Σω[ x  A ] B

infixr 4 _,ωω_

record Σωω (A : Setω) (B : A  Setω) : Setω where
  constructor _,ωω_
  field
    fstωω : A
    sndωω : B fstωω

open Σωω public

infix 2 Σωω-syntax

Σωω-syntax : (A : Setω)  (A  Setω)  Setω
Σωω-syntax = Σωω

syntax Σωω-syntax A  x  B) = Σωω[ x  A ] B

infixr 4 _,ℓ_

record Σℓ {ℓf : Level  Level} (B :    Set (ℓf )) : Setω where
  constructor _,ℓ_
  field
    fstℓ : Level
    sndℓ : B fstℓ

open Σℓ public

infix 2 Σℓ-syntax

Σℓ-syntax : {ℓf : Level  Level}  (∀   Set (ℓf ))  Setω
Σℓ-syntax = Σℓ

syntax Σℓ-syntax    B) = Σℓ[  ] B