packages feed

pandora-0.4.6: Pandora/Paradigm/Inventory/Environment.hs

{-# OPTIONS_GHC -fno-warn-orphans #-}

module Pandora.Paradigm.Inventory.Environment (Environment (..), Configured, env) where

import Pandora.Pattern.Semigroupoid ((.))
import Pandora.Pattern.Category (identity, ($))
import Pandora.Pattern.Functor.Covariant (Covariant ((-<$>-)))
import Pandora.Pattern.Functor.Contravariant (Contravariant ((->$<-)))
import Pandora.Pattern.Functor.Semimonoidal (Semimonoidal (multiply))
import Pandora.Pattern.Functor.Monoidal (Monoidal (unit))
import Pandora.Pattern.Functor.Distributive (Distributive ((-<<)))
import Pandora.Pattern.Functor.Bindable (Bindable ((=<<)))
import Pandora.Pattern.Functor.Monad (Monad)
import Pandora.Pattern.Functor.Divariant (Divariant ((>->)))
import Pandora.Paradigm.Primary.Algebraic.Exponential ((%))
import Pandora.Paradigm.Primary.Algebraic ()
import Pandora.Paradigm.Primary.Algebraic.Product ((:*:) ((:*:)))
import Pandora.Paradigm.Primary.Algebraic.One (One (One))
import Pandora.Paradigm.Primary.Algebraic (point)
import Pandora.Paradigm.Primary.Transformer.Flip (Flip (Flip))
import Pandora.Paradigm.Controlflow.Effect.Interpreted (Schematic, Interpreted (Primary, run, unite))
import Pandora.Paradigm.Controlflow.Effect.Transformer.Monadic (Monadic (wrap), (:>) (TM))
import Pandora.Paradigm.Controlflow.Effect.Adaptable (Adaptable (adapt))
import Pandora.Paradigm.Schemes.TU (TU (TU), type (<:.>))

newtype Environment e a = Environment (e -> a)

instance Covariant (->) (->) (Environment e) where
	f -<$>- Environment x = Environment $ f . x

instance Contravariant (->) (->) (Flip Environment a) where
	f ->$<- Flip (Environment g) = Flip . Environment $ g . f

instance Semimonoidal (->) (:*:) (:*:) (Environment e) where
	multiply (x :*: y) = unite $ multiply $ run x :*: run y

instance Monoidal (->) (->) (:*:) (:*:) (Environment e) where
	unit _ f = Environment $ \_ -> f One

instance Distributive (->) (->) (Environment e) where
	f -<< g = Environment $ (run -<$>- f) -<< g

instance Bindable (->) (Environment e) where
	f =<< Environment x = Environment $ \e -> (run % e) . f . x $ e

--instance Monad (Environment e) where

instance Divariant (->) (->) (->) Environment where
	(>->) ab cd bc = Environment $ ab >-> cd $ run bc

instance Interpreted (Environment e) where
	type Primary (Environment e) a = (->) e a
	run ~(Environment x) = x
	unite = Environment

type instance Schematic Monad (Environment e) = (<:.>) ((->) e)

instance Monadic (Environment e) where
	wrap x = TM . TU $ point -<$>- run x

type Configured e = Adaptable (Environment e)

env :: Configured e t => t e
env = adapt $ Environment identity