packages feed

text-rope-zipper-0.1.1.0: test/Util.hs

{-# OPTIONS_GHC -Wno-orphans #-}

module Util
    ( module Prelude
    , module Control.Arrow
    , module Control.Monad
    , module Data.Function
    , module Data.Maybe
    , module Data.Ord
    , module Data.String
    , module Debug.Trace
    , module Test.Hspec
    , module Test.Hspec.QuickCheck
    , module Test.QuickCheck
    , (!?)
    , boundedAdd
    )
where

import Control.Arrow
import Control.Monad
import Data.Function
import Data.Maybe
import Data.Ord (clamp)
import Data.String
import Data.Text qualified as Strict
import Data.Text.Lazy qualified as Lazy
import Data.Text.Lazy.Zipper (TextZipper)
import Data.Text.Lazy.Zipper qualified as TextZipper
import Data.Text.Rope (Rope)
import Data.Text.Rope qualified as Rope
import Data.Text.Rope.Zipper (RopeZipper)
import Data.Text.Rope.Zipper qualified as RopeZipper
import Debug.Trace
import Test.Hspec
import Test.Hspec.QuickCheck
import Test.QuickCheck
import Prelude

instance Arbitrary Strict.Text where
    arbitrary = fromString <$> listOf (elements "abcdefg\n")

instance Arbitrary Lazy.Text where
    arbitrary = Lazy.fromStrict <$> arbitrary

instance Arbitrary Rope where
    arbitrary = Rope.fromText <$> arbitrary

instance Arbitrary TextZipper where
    arbitrary = TextZipper.fromParts <$> arbitrary <*> arbitrary

instance Arbitrary RopeZipper where
    arbitrary = RopeZipper.fromParts <$> arbitrary <*> arbitrary

infixl 9 !?

-- | Get element n of a list, or Nothing. Like `!!` but safe.
(!?) :: [a] -> Int -> Maybe a
(!?) xs i = listToMaybe $ drop i xs

boundedAdd :: Int -> Word -> Word
boundedAdd delta = fromIntegral . clamp @Int (0, maxBound) . (+ delta) . fromIntegral