-- | Utilities for working with the sample tree
--
-- Intended for qualified import.
--
-- > import qualified Test.Falsify.Internal.SampleTree as SampleTree
module Test.Falsify.Internal.SampleTree (
    -- * Lenses
    next
  , left
  , right
  ) where

import Prelude hiding (map, mod)

import Optics.Core (Lens')

import qualified Optics.Core as Optics

import Test.Falsify.SampleTree (SampleTree(..), pattern Inf, Sample(..))

{-------------------------------------------------------------------------------
  Lenses

  NOTE: The setter part of these lenses leaves 'Minimal' sample tree unchanged.
-------------------------------------------------------------------------------}

next :: Lens' SampleTree Sample
next :: Lens' SampleTree Sample
next = (SampleTree -> Sample)
-> (SampleTree -> Sample -> SampleTree) -> Lens' SampleTree Sample
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Optics.lens SampleTree -> Sample
getter SampleTree -> Sample -> SampleTree
setter
  where
    getter :: SampleTree -> Sample
    getter :: SampleTree -> Sample
getter (Inf Sample
s SampleTree
_ SampleTree
_) = Sample
s

    setter :: SampleTree -> Sample -> SampleTree
    setter :: SampleTree -> Sample -> SampleTree
setter SampleTree
Minimal Sample
_            = SampleTree
Minimal
    setter (SampleTree Sample
_ SampleTree
l SampleTree
r) Sample
s = Sample -> SampleTree -> SampleTree -> SampleTree
SampleTree Sample
s SampleTree
l SampleTree
r

left :: Lens' SampleTree SampleTree
left :: Lens' SampleTree SampleTree
left = (SampleTree -> SampleTree)
-> (SampleTree -> SampleTree -> SampleTree)
-> Lens' SampleTree SampleTree
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Optics.lens SampleTree -> SampleTree
getter SampleTree -> SampleTree -> SampleTree
setter
  where
    getter :: SampleTree -> SampleTree
    getter :: SampleTree -> SampleTree
getter (Inf Sample
_ SampleTree
l SampleTree
_) = SampleTree
l

    setter :: SampleTree -> SampleTree -> SampleTree
    setter :: SampleTree -> SampleTree -> SampleTree
setter SampleTree
Minimal            SampleTree
_ = SampleTree
Minimal
    setter (SampleTree Sample
s SampleTree
_ SampleTree
r) SampleTree
l = Sample -> SampleTree -> SampleTree -> SampleTree
SampleTree Sample
s SampleTree
l SampleTree
r

right :: Lens' SampleTree SampleTree
right :: Lens' SampleTree SampleTree
right = (SampleTree -> SampleTree)
-> (SampleTree -> SampleTree -> SampleTree)
-> Lens' SampleTree SampleTree
forall s a b t. (s -> a) -> (s -> b -> t) -> Lens s t a b
Optics.lens SampleTree -> SampleTree
getter SampleTree -> SampleTree -> SampleTree
setter
  where
    getter :: SampleTree -> SampleTree
    getter :: SampleTree -> SampleTree
getter (Inf Sample
_ SampleTree
_ SampleTree
r) = SampleTree
r

    setter :: SampleTree -> SampleTree -> SampleTree
    setter :: SampleTree -> SampleTree -> SampleTree
setter SampleTree
Minimal            SampleTree
_ = SampleTree
Minimal
    setter (SampleTree Sample
s SampleTree
l SampleTree
_) SampleTree
r = Sample -> SampleTree -> SampleTree -> SampleTree
SampleTree Sample
s SampleTree
l SampleTree
r