packages feed

stm-containers-0.2.3: executables/APITests/MapTests/Update.hs

module APITests.MapTests.Update where

import Test.Framework
import BasePrelude hiding (insert, delete, update)
import MTLPrelude
import Control.Monad.Free
import Control.Monad.Free.TH


data UpdateF k v c =
  Insert k v c |
  Delete k c |
  Adjust (v -> v) k c
  deriving (Functor)

instance (Show k, Show v, Show c) => Show (UpdateF k v c) where
  showsPrec i = 
    showParen (i > 5) . \case
      Insert k v c -> 
        showString "Insert " . 
        showsPrecInner k .
        showChar ' ' .
        showsPrecInner v .
        showChar ' ' .
        showsPrecInner c
      Delete k c ->
        showString "Delete " .
        showsPrecInner k .
        showChar ' ' .
        showsPrecInner c
      Adjust f k c ->
        showString "Adjust " .
        showString "<v -> v> " .
        showsPrecInner k .
        showChar ' ' .
        showsPrecInner c
    where
      showsPrecInner = showsPrec (succ 5)

makeFree ''UpdateF

type Update k v = Free (UpdateF k v) ()

instance (Arbitrary k, Arbitrary v) => Arbitrary (Update k v) where
  arbitrary = 
    frequency
      [
        (1 , delete <$> arbitrary),
        (10, insert <$> arbitrary <*> arbitrary),
        (3 , adjust <$> (const <$> arbitrary) <*> arbitrary)
      ]