packages feed

proton-0.0.4: src/Data/Profunctor/State/Class.hs

{-# LANGUAGE FunctionalDependencies #-}
module Data.Profunctor.State.Class where

import Data.Profunctor
import Control.Category ((>>>))
import qualified Control.Category as C

class (C.Category p, Profunctor p) => ProfunctorState s p | p -> s where
  {-# MINIMAL state | (get, put) #-}
  get :: p a (a, s)
  get = state (rmap (\(a, s) -> ((a, s), s)) C.id)
  put :: p (a, s) a
  put = state (lmap (\((a, s), _) -> (a, s)) C.id)
  state :: p (a, s) (b, s) -> p a b
  state p = (get >>> p >>> put)


class (Profunctor p) => ProfunctorState' s p | p -> s where
  {-# MINIMAL (get', put') #-}
  get' :: p (a, s) b -> p a b
  put' :: p a (b, s) -> p a b