------------------------------------------------------------------------
-- The Agda standard library
--
-- A categorical view of Delay
------------------------------------------------------------------------

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

module Codata.Delay.Categorical where

open import Codata.Delay
open import Function
open import Category.Functor
open import Category.Applicative
open import Category.Monad
open import Data.These using (leftMost)

functor :  {i }  RawFunctor {}  A  Delay A i)
functor = record { _<$>_ = λ f  map f }

module Sequential where

  applicative :  {i }  RawApplicative {}  A  Delay A i)
  applicative = record
    { pure = now
    ; _⊛_  = λ df da  bind df  f  map f da)
    }

  applicativeZero :  {i }  RawApplicativeZero {}  A  Delay A i)
  applicativeZero = record
    { applicative = applicative
    ;            = never
    }

  monad :  {i }  RawMonad {}  A  Delay A i)
  monad = record
    { return = now
    ; _>>=_  = bind
    }

  monadZero :  {i }  RawMonadZero {}  A  Delay A i)
  monadZero = record
    { monad           = monad
    ; applicativeZero = applicativeZero
    }

module Zippy where

  applicative :  {i }  RawApplicative {}  A  Delay A i)
  applicative = record
    { pure = now
    ; _⊛_  = zipWith id
    }

  applicativeZero :  {i }  RawApplicativeZero {}  A  Delay A i)
  applicativeZero = record
    { applicative = applicative
    ;            = never
    }

  alternative :  {i }  RawAlternative {}  A  Delay A i)
  alternative = record
    { applicativeZero = applicativeZero
    ; _∣_             = alignWith leftMost
    }