{-# OPTIONS --without-K #-}
open import Type
open import Relation.Binary
open import Level.NP
open import Function using (id; _∘_; const)
open import Relation.Binary.PropositionalEquality using (_≡_)

open import Category.Functor public

module Category.Functor.NP where

Fmap :  {i j ℓ₁ ℓ₂} {I : ★_ i} {J : ★_ j}
         (_↝₁_ : Rel I ℓ₁) (_↝₂_ : Rel J ℓ₂) (F : I  J)  ★_ _
Fmap _↝₁_ _↝₂_ F =  {A B}  A ↝₁ B  F A ↝₂ F B

record IsFunctorial {} {F : Set   Set } (rawFunctor : RawFunctor F) : ★_ ( ) where
  open RawFunctor rawFunctor
  field
    <$>-id :  {A} (x : F A)  id <$> x  x

    <$>-∘  :  {A B C} (f : B  C) (g : A  B) x  (f  g) <$> x  f <$> (g <$> x)

  <$-∘ :  {A B C} (f : A  B) (x : C) y  x <$ y  x <$ (f <$> y)
  <$-∘ f x = <$>-∘ (const x) f

record Functor {} (F : Set   Set ) : ★_ ( ) where
  field
    rawFunctor   : RawFunctor F
    isFunctorial : IsFunctorial rawFunctor

  open RawFunctor   rawFunctor   public
  open IsFunctorial isFunctorial public