-- |'AtomicState' combinators for lenses
module Prelate.Atomic where

import Incipit (AtomicState, Member, Sem, atomicGets, atomicModify')
import Lens.Micro (Lens', (.~))
import Lens.Micro.Extras (view)

-- |Modify the focus of a lens in 'AtomicState'.
atomicSet ::
  Member (AtomicState s) r =>
  Lens' s a ->
  a ->
  Sem r ()
atomicSet :: forall s (r :: EffectRow) a.
Member (AtomicState s) r =>
Lens' s a -> a -> Sem r ()
atomicSet Lens' s a
l a
a =
  forall s (r :: EffectRow).
Member (AtomicState s) r =>
(s -> s) -> Sem r ()
atomicModify' (Lens' s a
l forall s t a b. ASetter s t a b -> b -> s -> t
.~ a
a)

-- |View the focus of a lens in 'AtomicState'.
atomicView ::
  Member (AtomicState s) r =>
  Lens' s a ->
  Sem r a
atomicView :: forall s (r :: EffectRow) a.
Member (AtomicState s) r =>
Lens' s a -> Sem r a
atomicView Lens' s a
l =
  forall s s' (r :: EffectRow).
Member (AtomicState s) r =>
(s -> s') -> Sem r s'
atomicGets (forall a s. Getting a s a -> s -> a
view Lens' s a
l)