packages feed

cursor-gen-0.4.0.0: src/Cursor/Tree/Gen.hs

{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RecordWildCards #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Cursor.Tree.Gen
  (
  )
where

import Cursor.Tree
import Data.GenValidity
import Data.GenValidity.Containers ()
import qualified Data.List.NonEmpty as NE
import Test.QuickCheck

instance GenValid TreeCursorSelection where
  genValid = genValidStructurallyWithoutExtraChecking
  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering

instance GenValid a => GenValid (SwapResult a) where
  genValid = genValidStructurallyWithoutExtraChecking
  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering

instance GenValid a => GenValid (PromoteElemResult a) where
  genValid = genValidStructurallyWithoutExtraChecking
  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering

instance GenValid a => GenValid (PromoteResult a) where
  genValid = genValidStructurallyWithoutExtraChecking
  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering

instance GenValid a => GenValid (DemoteResult a) where
  genValid = genValidStructurallyWithoutExtraChecking
  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering

instance GenValid a => GenValid (CTree a) where
  genValid =
    sized $ \n -> do
      (a, b) <- genSplit n
      val <- resize a genValid
      for <- resize b genValid
      pure $ CNode val for
  shrinkValid (CNode a cf) = [CNode a' cf' | (a', cf') <- shrinkValid (a, cf)]

instance GenValid a => GenValid (CForest a) where
  genValid =
    sized $ \case
      0 -> pure EmptyCForest
      _ -> oneof [ClosedForest <$> genValid, OpenForest <$> genValid]
  shrinkValid EmptyCForest = []
  shrinkValid (ClosedForest ne) = EmptyCForest : (ClosedForest <$> shrinkValid ne)
  shrinkValid (OpenForest ne) =
    EmptyCForest : ClosedForest (NE.map rebuildCTree ne) : (OpenForest <$> shrinkValid ne)

instance (GenValid a, GenValid b) => GenValid (TreeCursor a b) where
  genValid =
    sized $ \n -> do
      s <- upTo n
      (a, b, c, d) <- genSplit4 s
      treeAbove <- resize (a + b) genValid
      treeCurrent <- resize c genValid
      treeBelow <- resize d genValid
      pure TreeCursor {..}
  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering

instance GenValid b => GenValid (TreeAbove b) where
  genValid =
    sized $ \n -> do
      s <- upTo n
      (a, b, c, d) <- genSplit4 s
      treeAboveLefts <- resize a genValid
      treeAboveAbove <- resize b genValid
      treeAboveNode <- resize c genValid
      treeAboveRights <- resize d genValid
      pure TreeAbove {..}
  shrinkValid = shrinkValidStructurallyWithoutExtraFiltering