cross f g = over _1 f . over _2 g

newtype State s a = St{unSt :: s -> (s,a)}

newtype Counter a = C{unC :: State Int a}

instance Functor Counter where
    fmap f (C  (St p)) = C . St $ (cross id f) . p
