{-# LANGUAGE FunctionalDependencies #-}

module Control.Arrow.State.Class where

import Control.Arrow;

class Arrow r => ArrowState s r | r -> s where {
  get :: r ()  s;
  put :: r s  ();
};

gets :: ArrowState s r => (s -> a) -> r () a;
gets f = get >>> arr f;

set :: ArrowState s r => (s -> s) -> r a a;
set f = arr id &&& (arr (const ()) >>> get >>> arr f >>> put) >>> arr fst;