{-# LANGUAGE TypeApplications #-}
{-# OPTIONS_GHC -Wno-orphans #-}

module Test.VMap where

import qualified Data.List as List
import qualified Data.Map.Strict as Map
import Data.VMap as VMap
import Test.Common

type MapT = Map.Map Char Int

type VMapT = VMap VB VP Char Int

instance
  (Ord k, Vector kv k, Vector vv v, Arbitrary k, Arbitrary v) =>
  Arbitrary (VMap kv vv k v)
  where
  arbitrary :: Gen (VMap kv vv k v)
arbitrary =
    Map k v -> VMap kv vv k v
forall (kv :: * -> *) k (vv :: * -> *) v.
(Vector kv k, Vector vv v) =>
Map k v -> VMap kv vv k v
VMap.fromMap (Map k v -> VMap kv vv k v)
-> ([(k, v)] -> Map k v) -> [(k, v)] -> VMap kv vv k v
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(k, v)] -> Map k v
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(k, v)] -> VMap kv vv k v)
-> Gen [(k, v)] -> Gen (VMap kv vv k v)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Gen [(k, v)]
forall a. Arbitrary a => Gen a
arbitrary

prop_Roundtrip :: (VMapT -> a) -> (a -> VMapT) -> VMapT -> Property
prop_Roundtrip :: forall a. (VMapT -> a) -> (a -> VMapT) -> VMapT -> Property
prop_Roundtrip VMapT -> a
to a -> VMapT
from VMapT
km = a -> VMapT
from (VMapT -> a
to VMapT
km) VMapT -> VMapT -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== VMapT
km

prop_AsMapTo ::
  (Show a, Eq a) => (VMapT -> a) -> (MapT -> a) -> VMapT -> Property
prop_AsMapTo :: forall a.
(Show a, Eq a) =>
(VMapT -> a) -> (Map Char Int -> a) -> VMapT -> Property
prop_AsMapTo VMapT -> a
fromVM Map Char Int -> a
fromM VMapT
vm = VMapT -> a
fromVM VMapT
vm a -> a -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Map Char Int -> a
fromM (VMapT -> Map Char Int
forall (kv :: * -> *) k (vv :: * -> *) v.
(Vector kv k, Vector vv v) =>
VMap kv vv k v -> Map k v
toMap VMapT
vm)

prop_AsMapFrom :: (a -> VMapT) -> (a -> MapT) -> a -> Property
prop_AsMapFrom :: forall a. (a -> VMapT) -> (a -> Map Char Int) -> a -> Property
prop_AsMapFrom a -> VMapT
mkVMap a -> Map Char Int
mkMap a
a = VMapT -> Map Char Int
forall (kv :: * -> *) k (vv :: * -> *) v.
(Vector kv k, Vector vv v) =>
VMap kv vv k v -> Map k v
toMap (a -> VMapT
mkVMap a
a) Map Char Int -> Map Char Int -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== a -> Map Char Int
mkMap a
a

vMapTests :: Spec
vMapTests :: Spec
vMapTests =
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"VMap" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"roundtrip" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String -> (VMapT -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"to/fromAscDistinctList" ((VMapT -> Property) -> Spec) -> (VMapT -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$
        (VMapT -> [(Char, Int)])
-> ([(Char, Int)] -> VMapT) -> VMapT -> Property
forall a. (VMapT -> a) -> (a -> VMapT) -> VMapT -> Property
prop_Roundtrip VMapT -> [(Char, Int)]
forall (kv :: * -> *) k (vv :: * -> *) v.
(Vector kv k, Vector vv v) =>
VMap kv vv k v -> [(k, v)]
VMap.toAscList [(Char, Int)] -> VMapT
forall (kv :: * -> *) k (vv :: * -> *) v.
(Vector kv k, Vector vv v) =>
[(k, v)] -> VMap kv vv k v
VMap.fromDistinctAscList
      String -> (VMapT -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"to/fromAscList" ((VMapT -> Property) -> Spec) -> (VMapT -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ (VMapT -> [(Char, Int)])
-> ([(Char, Int)] -> VMapT) -> VMapT -> Property
forall a. (VMapT -> a) -> (a -> VMapT) -> VMapT -> Property
prop_Roundtrip VMapT -> [(Char, Int)]
forall (kv :: * -> *) k (vv :: * -> *) v.
(Vector kv k, Vector vv v) =>
VMap kv vv k v -> [(k, v)]
VMap.toAscList [(Char, Int)] -> VMapT
forall k (kv :: * -> *) (vv :: * -> *) v.
(Eq k, Vector kv k, Vector vv v) =>
[(k, v)] -> VMap kv vv k v
VMap.fromAscList
      String -> (VMapT -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"to/fromList" ((VMapT -> Property) -> Spec) -> (VMapT -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ (VMapT -> [(Char, Int)])
-> ([(Char, Int)] -> VMapT) -> VMapT -> Property
forall a. (VMapT -> a) -> (a -> VMapT) -> VMapT -> Property
prop_Roundtrip VMapT -> [(Char, Int)]
forall (kv :: * -> *) k (vv :: * -> *) v.
(Vector kv k, Vector vv v) =>
VMap kv vv k v -> [(k, v)]
VMap.toAscList [(Char, Int)] -> VMapT
forall k (kv :: * -> *) (vv :: * -> *) v.
(Ord k, Vector kv k, Vector vv v) =>
[(k, v)] -> VMap kv vv k v
VMap.fromList
      String -> (VMapT -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"to/fromMap" ((VMapT -> Property) -> Spec) -> (VMapT -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ (VMapT -> Map Char Int)
-> (Map Char Int -> VMapT) -> VMapT -> Property
forall a. (VMapT -> a) -> (a -> VMapT) -> VMapT -> Property
prop_Roundtrip VMapT -> Map Char Int
forall (kv :: * -> *) k (vv :: * -> *) v.
(Vector kv k, Vector vv v) =>
VMap kv vv k v -> Map k v
VMap.toMap Map Char Int -> VMapT
forall (kv :: * -> *) k (vv :: * -> *) v.
(Vector kv k, Vector vv v) =>
Map k v -> VMap kv vv k v
VMap.fromMap
    String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe String
"asMap" (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
      String
-> ([(Char, Int)] -> Fun (Char, Int) (Maybe Int) -> Property)
-> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"mapMaybeWithKey" (([(Char, Int)] -> Fun (Char, Int) (Maybe Int) -> Property)
 -> Spec)
-> ([(Char, Int)] -> Fun (Char, Int) (Maybe Int) -> Property)
-> Spec
forall a b. (a -> b) -> a -> b
$ \[(Char, Int)]
xs Fun (Char, Int) (Maybe Int)
f ->
        (Map Char Int -> VMapT)
-> (Map Char Int -> Map Char Int) -> Map Char Int -> Property
forall a. (a -> VMapT) -> (a -> Map Char Int) -> a -> Property
prop_AsMapFrom
          (\Map Char Int
m -> (Char -> Int -> Maybe Int) -> VMapT -> VMapT
forall (kv :: * -> *) k (vv :: * -> *) a b.
(Vector kv k, Vector vv a, Vector vv b) =>
(k -> a -> Maybe b) -> VMap kv vv k a -> VMap kv vv k b
VMap.mapMaybeWithKey (Fun (Char, Int) (Maybe Int) -> Char -> Int -> Maybe Int
forall a b c. Fun (a, b) c -> a -> b -> c
applyFun2 Fun (Char, Int) (Maybe Int)
f) (Map Char Int -> VMapT
forall (kv :: * -> *) k (vv :: * -> *) v.
(Vector kv k, Vector vv v) =>
Map k v -> VMap kv vv k v
VMap.fromMap Map Char Int
m))
          ((Char -> Int -> Maybe Int) -> Map Char Int -> Map Char Int
forall k a b. (k -> a -> Maybe b) -> Map k a -> Map k b
Map.mapMaybeWithKey (Fun (Char, Int) (Maybe Int) -> Char -> Int -> Maybe Int
forall a b c. Fun (a, b) c -> a -> b -> c
applyFun2 Fun (Char, Int) (Maybe Int)
f) :: MapT -> MapT)
          ([(Char, Int)] -> Map Char Int
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(Char, Int)]
xs)
      String -> ([(Char, Int)] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"fromList" (([(Char, Int)] -> Property) -> Spec)
-> ([(Char, Int)] -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ ([(Char, Int)] -> VMapT)
-> ([(Char, Int)] -> Map Char Int) -> [(Char, Int)] -> Property
forall a. (a -> VMapT) -> (a -> Map Char Int) -> a -> Property
prop_AsMapFrom [(Char, Int)] -> VMapT
forall k (kv :: * -> *) (vv :: * -> *) v.
(Ord k, Vector kv k, Vector vv v) =>
[(k, v)] -> VMap kv vv k v
VMap.fromList [(Char, Int)] -> Map Char Int
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList
      String
-> ([(Char, Int)] -> Fun (Char, Int, Int) Int -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"fromAscListWithKey" (([(Char, Int)] -> Fun (Char, Int, Int) Int -> Property) -> Spec)
-> ([(Char, Int)] -> Fun (Char, Int, Int) Int -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ \[(Char, Int)]
xs Fun (Char, Int, Int) Int
f ->
        ([(Char, Int)] -> VMapT)
-> ([(Char, Int)] -> Map Char Int) -> [(Char, Int)] -> Property
forall a. (a -> VMapT) -> (a -> Map Char Int) -> a -> Property
prop_AsMapFrom
          ((Char -> Int -> Int -> Int) -> [(Char, Int)] -> VMapT
forall k (kv :: * -> *) (vv :: * -> *) v.
(Eq k, Vector kv k, Vector vv v) =>
(k -> v -> v -> v) -> [(k, v)] -> VMap kv vv k v
VMap.fromAscListWithKey (Fun (Char, Int, Int) Int -> Char -> Int -> Int -> Int
forall a b c d. Fun (a, b, c) d -> a -> b -> c -> d
applyFun3 Fun (Char, Int, Int) Int
f))
          ((Char -> Int -> Int -> Int) -> [(Char, Int)] -> Map Char Int
forall k a. Eq k => (k -> a -> a -> a) -> [(k, a)] -> Map k a
Map.fromAscListWithKey (Fun (Char, Int, Int) Int -> Char -> Int -> Int -> Int
forall a b c d. Fun (a, b, c) d -> a -> b -> c -> d
applyFun3 Fun (Char, Int, Int) Int
f))
          (((Char, Int) -> Char) -> [(Char, Int)] -> [(Char, Int)]
forall b a. Ord b => (a -> b) -> [a] -> [a]
List.sortOn (Char, Int) -> Char
forall a b. (a, b) -> a
fst [(Char, Int)]
xs)
      String
-> (Int -> [(Char, Int)] -> Fun (Char, Int, Int) Int -> Property)
-> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"fromAscListWithKeyN" ((Int -> [(Char, Int)] -> Fun (Char, Int, Int) Int -> Property)
 -> Spec)
-> (Int -> [(Char, Int)] -> Fun (Char, Int, Int) Int -> Property)
-> Spec
forall a b. (a -> b) -> a -> b
$ \Int
n [(Char, Int)]
xs Fun (Char, Int, Int) Int
f ->
        ([(Char, Int)] -> VMapT)
-> ([(Char, Int)] -> Map Char Int) -> [(Char, Int)] -> Property
forall a. (a -> VMapT) -> (a -> Map Char Int) -> a -> Property
prop_AsMapFrom
          (Int -> (Char -> Int -> Int -> Int) -> [(Char, Int)] -> VMapT
forall k (kv :: * -> *) (vv :: * -> *) v.
(Eq k, Vector kv k, Vector vv v) =>
Int -> (k -> v -> v -> v) -> [(k, v)] -> VMap kv vv k v
VMap.fromAscListWithKeyN Int
n (Fun (Char, Int, Int) Int -> Char -> Int -> Int -> Int
forall a b c d. Fun (a, b, c) d -> a -> b -> c -> d
applyFun3 Fun (Char, Int, Int) Int
f))
          ((Char -> Int -> Int -> Int) -> [(Char, Int)] -> Map Char Int
forall k a. Eq k => (k -> a -> a -> a) -> [(k, a)] -> Map k a
Map.fromAscListWithKey (Fun (Char, Int, Int) Int -> Char -> Int -> Int -> Int
forall a b c d. Fun (a, b, c) d -> a -> b -> c -> d
applyFun3 Fun (Char, Int, Int) Int
f) ([(Char, Int)] -> Map Char Int)
-> ([(Char, Int)] -> [(Char, Int)])
-> [(Char, Int)]
-> Map Char Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [(Char, Int)] -> [(Char, Int)]
forall a. Int -> [a] -> [a]
take Int
n)
          (((Char, Int) -> Char) -> [(Char, Int)] -> [(Char, Int)]
forall b a. Ord b => (a -> b) -> [a] -> [a]
List.sortOn (Char, Int) -> Char
forall a b. (a, b) -> a
fst [(Char, Int)]
xs)
      String
-> ([(Char, Int)]
    -> [(Char, Int)] -> Fun (Char, Int, Int) Int -> Property)
-> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"unionWithKey" (([(Char, Int)]
  -> [(Char, Int)] -> Fun (Char, Int, Int) Int -> Property)
 -> Spec)
-> ([(Char, Int)]
    -> [(Char, Int)] -> Fun (Char, Int, Int) Int -> Property)
-> Spec
forall a b. (a -> b) -> a -> b
$ \[(Char, Int)]
xs1 [(Char, Int)]
xs2 Fun (Char, Int, Int) Int
f ->
        ((Map Char Int, Map Char Int) -> VMapT)
-> ((Map Char Int, Map Char Int) -> Map Char Int)
-> (Map Char Int, Map Char Int)
-> Property
forall a. (a -> VMapT) -> (a -> Map Char Int) -> a -> Property
prop_AsMapFrom
          (\(Map Char Int
m1, Map Char Int
m2) -> (Char -> Int -> Int -> Int) -> VMapT -> VMapT -> VMapT
forall k (kv :: * -> *) (vv :: * -> *) v.
(Ord k, Vector kv k, Vector vv v) =>
(k -> v -> v -> v)
-> VMap kv vv k v -> VMap kv vv k v -> VMap kv vv k v
VMap.unionWithKey (Fun (Char, Int, Int) Int -> Char -> Int -> Int -> Int
forall a b c d. Fun (a, b, c) d -> a -> b -> c -> d
applyFun3 Fun (Char, Int, Int) Int
f) (Map Char Int -> VMapT
forall (kv :: * -> *) k (vv :: * -> *) v.
(Vector kv k, Vector vv v) =>
Map k v -> VMap kv vv k v
VMap.fromMap Map Char Int
m1) (Map Char Int -> VMapT
forall (kv :: * -> *) k (vv :: * -> *) v.
(Vector kv k, Vector vv v) =>
Map k v -> VMap kv vv k v
VMap.fromMap Map Char Int
m2))
          ((Map Char Int -> Map Char Int -> Map Char Int)
-> (Map Char Int, Map Char Int) -> Map Char Int
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ((Char -> Int -> Int -> Int)
-> Map Char Int -> Map Char Int -> Map Char Int
forall k a.
Ord k =>
(k -> a -> a -> a) -> Map k a -> Map k a -> Map k a
Map.unionWithKey (Fun (Char, Int, Int) Int -> Char -> Int -> Int -> Int
forall a b c d. Fun (a, b, c) d -> a -> b -> c -> d
applyFun3 Fun (Char, Int, Int) Int
f)))
          ([(Char, Int)] -> Map Char Int
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(Char, Int)]
xs1, [(Char, Int)] -> Map Char Int
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(Char, Int)]
xs2)
      String -> ([(Char, Int)] -> [(Char, Int)] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"mappend" (([(Char, Int)] -> [(Char, Int)] -> Property) -> Spec)
-> ([(Char, Int)] -> [(Char, Int)] -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ \[(Char, Int)]
xs1 [(Char, Int)]
xs2 ->
        ((Map Char Int, Map Char Int) -> VMapT)
-> ((Map Char Int, Map Char Int) -> Map Char Int)
-> (Map Char Int, Map Char Int)
-> Property
forall a. (a -> VMapT) -> (a -> Map Char Int) -> a -> Property
prop_AsMapFrom
          (\(Map Char Int
m1, Map Char Int
m2) -> Map Char Int -> VMapT
forall (kv :: * -> *) k (vv :: * -> *) v.
(Vector kv k, Vector vv v) =>
Map k v -> VMap kv vv k v
VMap.fromMap Map Char Int
m1 VMapT -> VMapT -> VMapT
forall a. Semigroup a => a -> a -> a
<> Map Char Int -> VMapT
forall (kv :: * -> *) k (vv :: * -> *) v.
(Vector kv k, Vector vv v) =>
Map k v -> VMap kv vv k v
VMap.fromMap Map Char Int
m2)
          ((Map Char Int -> Map Char Int -> Map Char Int)
-> (Map Char Int, Map Char Int) -> Map Char Int
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Map Char Int -> Map Char Int -> Map Char Int
forall a. Semigroup a => a -> a -> a
(<>))
          ([(Char, Int)] -> Map Char Int
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(Char, Int)]
xs1, [(Char, Int)] -> Map Char Int
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(Char, Int)]
xs2)
      String -> (VMapT -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"toAscList" ((VMapT -> Property) -> Spec) -> (VMapT -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ (VMapT -> [(Char, Int)])
-> (Map Char Int -> [(Char, Int)]) -> VMapT -> Property
forall a.
(Show a, Eq a) =>
(VMapT -> a) -> (Map Char Int -> a) -> VMapT -> Property
prop_AsMapTo VMapT -> [(Char, Int)]
forall (kv :: * -> *) k (vv :: * -> *) v.
(Vector kv k, Vector vv v) =>
VMap kv vv k v -> [(k, v)]
VMap.toAscList Map Char Int -> [(Char, Int)]
forall k a. Map k a -> [(k, a)]
Map.toAscList
      String -> (Fun (Char, Int) String -> VMapT -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"foldMapWithKey" ((Fun (Char, Int) String -> VMapT -> Property) -> Spec)
-> (Fun (Char, Int) String -> VMapT -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ \Fun (Char, Int) String
f ->
        let f' :: Char -> Int -> String
f' Char
k Int
v = Fun (Char, Int) String -> Char -> Int -> String
forall a b c. Fun (a, b) c -> a -> b -> c
applyFun2 Fun (Char, Int) String
f Char
k Int
v :: String
         in (VMapT -> String) -> (Map Char Int -> String) -> VMapT -> Property
forall a.
(Show a, Eq a) =>
(VMapT -> a) -> (Map Char Int -> a) -> VMapT -> Property
prop_AsMapTo ((Char -> Int -> String) -> VMapT -> String
forall (kv :: * -> *) k (vv :: * -> *) v m.
(Vector kv k, Vector vv v, Monoid m) =>
(k -> v -> m) -> VMap kv vv k v -> m
VMap.foldMapWithKey Char -> Int -> String
f') ((Char -> Int -> String) -> Map Char Int -> String
forall m k a. Monoid m => (k -> a -> m) -> Map k a -> m
Map.foldMapWithKey Char -> Int -> String
f')
      String -> (Char -> VMapT -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"lookup" ((Char -> VMapT -> Property) -> Spec)
-> (Char -> VMapT -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ \Char
k -> (VMapT -> Maybe Int)
-> (Map Char Int -> Maybe Int) -> VMapT -> Property
forall a.
(Show a, Eq a) =>
(VMapT -> a) -> (Map Char Int -> a) -> VMapT -> Property
prop_AsMapTo (Char -> VMapT -> Maybe Int
forall k (kv :: * -> *) (vv :: * -> *) v.
(Ord k, Vector kv k, Vector vv v) =>
k -> VMap kv vv k v -> Maybe v
VMap.lookup Char
k) (Char -> Map Char Int -> Maybe Int
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Char
k)
      String -> (Char -> Int -> [(Char, Int)] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"lookup (existing)" ((Char -> Int -> [(Char, Int)] -> Property) -> Spec)
-> (Char -> Int -> [(Char, Int)] -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ \Char
k Int
v [(Char, Int)]
xs ->
        let xs' :: [(Char, Int)]
xs' = [(Char, Int)]
xs [(Char, Int)] -> [(Char, Int)] -> [(Char, Int)]
forall a. Semigroup a => a -> a -> a
<> [(Char
k, Int
v)]
         in (Char -> VMapT -> Maybe Int
forall k (kv :: * -> *) (vv :: * -> *) v.
(Ord k, Vector kv k, Vector vv v) =>
k -> VMap kv vv k v -> Maybe v
VMap.lookup Char
k ([(Char, Int)] -> VMapT
forall k (kv :: * -> *) (vv :: * -> *) v.
(Ord k, Vector kv k, Vector vv v) =>
[(k, v)] -> VMap kv vv k v
VMap.fromList [(Char, Int)]
xs' :: VMapT) Maybe Int -> Maybe Int -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Int -> Maybe Int
forall a. a -> Maybe a
Just Int
v)
              Property -> Property -> Property
forall prop1 prop2.
(Testable prop1, Testable prop2) =>
prop1 -> prop2 -> Property
.&&. (Char -> Map Char Int -> Maybe Int
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Char
k ([(Char, Int)] -> Map Char Int
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(Char, Int)]
xs' :: MapT) Maybe Int -> Maybe Int -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Int -> Maybe Int
forall a. a -> Maybe a
Just Int
v)
      String -> (Int -> Char -> VMapT -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"findWithDefault" ((Int -> Char -> VMapT -> Property) -> Spec)
-> (Int -> Char -> VMapT -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ \Int
d Char
k ->
        (VMapT -> Int) -> (Map Char Int -> Int) -> VMapT -> Property
forall a.
(Show a, Eq a) =>
(VMapT -> a) -> (Map Char Int -> a) -> VMapT -> Property
prop_AsMapTo (Int -> Char -> VMapT -> Int
forall k (kv :: * -> *) (vv :: * -> *) v.
(Ord k, Vector kv k, Vector vv v) =>
v -> k -> VMap kv vv k v -> v
VMap.findWithDefault Int
d Char
k) (Int -> Char -> Map Char Int -> Int
forall k a. Ord k => a -> k -> Map k a -> a
Map.findWithDefault Int
d Char
k)
      String -> (Char -> Int -> [(Char, Int)] -> Property) -> Spec
forall prop.
(HasCallStack, Testable prop) =>
String -> prop -> Spec
prop String
"findWithDefault (existing)" ((Char -> Int -> [(Char, Int)] -> Property) -> Spec)
-> (Char -> Int -> [(Char, Int)] -> Property) -> Spec
forall a b. (a -> b) -> a -> b
$ \Char
k Int
v [(Char, Int)]
xs ->
        let xs' :: [(Char, Int)]
xs' = [(Char, Int)]
xs [(Char, Int)] -> [(Char, Int)] -> [(Char, Int)]
forall a. Semigroup a => a -> a -> a
<> [(Char
k, Int
v)]
            unfound :: a
unfound = String -> a
forall a. HasCallStack => String -> a
error (String -> a) -> String -> a
forall a b. (a -> b) -> a -> b
$ String
"the expected key " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Char -> String
forall a. Show a => a -> String
show Char
k String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" was not found"
         in (Int -> Char -> VMapT -> Int
forall k (kv :: * -> *) (vv :: * -> *) v.
(Ord k, Vector kv k, Vector vv v) =>
v -> k -> VMap kv vv k v -> v
VMap.findWithDefault Int
forall {a}. a
unfound Char
k ([(Char, Int)] -> VMapT
forall k (kv :: * -> *) (vv :: * -> *) v.
(Ord k, Vector kv k, Vector vv v) =>
[(k, v)] -> VMap kv vv k v
VMap.fromList [(Char, Int)]
xs' :: VMapT) Int -> Int -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Int
v)
              Property -> Property -> Property
forall prop1 prop2.
(Testable prop1, Testable prop2) =>
prop1 -> prop2 -> Property
.&&. (Int -> Char -> Map Char Int -> Int
forall k a. Ord k => a -> k -> Map k a -> a
Map.findWithDefault Int
forall {a}. a
unfound Char
k ([(Char, Int)] -> Map Char Int
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList [(Char, Int)]
xs' :: MapT) Int -> Int -> Property
forall a. (Eq a, Show a) => a -> a -> Property
=== Int
v)
    String -> [Laws] -> Spec
testLawsGroup String
"classes" ([Laws] -> Spec) -> [Laws] -> Spec
forall a b. (a -> b) -> a -> b
$
      [ Proxy VMapT -> Laws
forall a. (Eq a, Arbitrary a, Show a) => Proxy a -> Laws
eqLaws (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @VMapT)
      , Proxy VMapT -> Laws
forall a.
(Semigroup a, Eq a, Arbitrary a, Show a) =>
Proxy a -> Laws
semigroupLaws (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @VMapT)
      , Proxy VMapT -> Laws
forall a. (Monoid a, Eq a, Arbitrary a, Show a) => Proxy a -> Laws
monoidLaws (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @VMapT)
      , Proxy VMapT -> Laws
forall a.
(IsList a, Show a, Show (Item a), Arbitrary a, Arbitrary (Item a),
 Eq a) =>
Proxy a -> Laws
isListLaws (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @VMapT)
      ]