module Data.Container.Refined.Conversion where import Data.Constraint (Dict(..)) import Data.Container.Refined.Hashable import Data.Container.Refined.Proofs import qualified Data.HashMap.Lazy as HashMap import Data.HashMap.Common.Refined import qualified Data.HashSet as HashSet import qualified Data.IntMap as IntMap import Data.IntMap.Common.Refined import qualified Data.IntSet as IntSet import qualified Data.Map as Map import Data.Map.Common.Refined import Data.Proxy import Data.Reflection import qualified Data.Set as Set import Data.Type.Equality ((:~:)(..)) import Unsafe.Coerce unsafeWrapSet :: forall r r' a. KnownSet r' a => Proxy r' -> Set r a unsafeWrapSet :: forall r r' a. KnownSet r' a => Proxy r' -> Set r a unsafeWrapSet Proxy r' _ = case (Any :~: Any) -> r :~: r' forall a b. a -> b unsafeCoerce Any :~: Any forall {k} (a :: k). a :~: a Refl :: r :~: r' of r :~: r' Refl -> Set r a forall (a :: Constraint). a => Dict a Dict {-# INLINE unsafeWrapSet #-} unsafeWrapIntSet :: forall r r'. KnownIntSet r' => Proxy r' -> IntSet r unsafeWrapIntSet :: forall r r'. KnownIntSet r' => Proxy r' -> IntSet r unsafeWrapIntSet Proxy r' _ = case (Any :~: Any) -> r :~: r' forall a b. a -> b unsafeCoerce Any :~: Any forall {k} (a :: k). a :~: a Refl :: r :~: r' of r :~: r' Refl -> IntSet r forall (a :: Constraint). a => Dict a Dict {-# INLINE unsafeWrapIntSet #-} unsafeWrapHashSet :: forall r r' a. KnownHashSet r' a => Proxy r' -> HashSet r a unsafeWrapHashSet :: forall r r' a. KnownHashSet r' a => Proxy r' -> HashSet r a unsafeWrapHashSet Proxy r' _ = case (Any :~: Any) -> r :~: r' forall a b. a -> b unsafeCoerce Any :~: Any forall {k} (a :: k). a :~: a Refl :: r :~: r' of r :~: r' Refl -> HashSet r a forall (a :: Constraint). a => Dict a Dict {-# INLINE unsafeWrapHashSet #-} set2IntSet :: forall s. KnownSet s Int => IntSet s set2IntSet :: forall s. KnownSet s Int => IntSet s set2IntSet = IntSet -> (forall s. Reifies s IntSet => Proxy s -> IntSet s) -> IntSet s forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r reify ([Int] -> IntSet IntSet.fromDistinctAscList ([Int] -> IntSet) -> [Int] -> IntSet forall a b. (a -> b) -> a -> b $ Set Int -> [Int] forall a. Set a -> [a] Set.toAscList (Set Int -> [Int]) -> Set Int -> [Int] forall a b. (a -> b) -> a -> b $ Proxy s -> Set Int forall {k} (s :: k) a (proxy :: k -> *). Reifies s a => proxy s -> a forall (proxy :: * -> *). proxy s -> Set Int reflect (Proxy s -> Set Int) -> Proxy s -> Set Int forall a b. (a -> b) -> a -> b $ forall t. Proxy t forall {k} (t :: k). Proxy t Proxy @s) Proxy s -> IntSet s forall s. Reifies s IntSet => Proxy s -> IntSet s forall r r'. KnownIntSet r' => Proxy r' -> IntSet r unsafeWrapIntSet map2IntMap :: forall s a. Map s Int a -> IntMap s a map2IntMap :: forall s a. Map s Int a -> IntMap s a map2IntMap (Map Map Int a m) = IntMap a -> IntMap s a forall s a. IntMap a -> IntMap s a IntMap (IntMap a -> IntMap s a) -> IntMap a -> IntMap s a forall a b. (a -> b) -> a -> b $ [(Int, a)] -> IntMap a forall a. [(Int, a)] -> IntMap a IntMap.fromDistinctAscList ([(Int, a)] -> IntMap a) -> [(Int, a)] -> IntMap a forall a b. (a -> b) -> a -> b $ Map Int a -> [(Int, a)] forall k a. Map k a -> [(k, a)] Map.toAscList Map Int a m set2HashSet :: forall s a. (Hashable a, KnownSet s a) => HashSet s a set2HashSet :: forall s a. (Hashable a, KnownSet s a) => HashSet s a set2HashSet = HashSet a -> (forall s. Reifies s (HashSet a) => Proxy s -> HashSet s a) -> HashSet s a forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r reify ([a] -> HashSet a forall a. (Eq a, Hashable a) => [a] -> HashSet a HashSet.fromList ([a] -> HashSet a) -> [a] -> HashSet a forall a b. (a -> b) -> a -> b $ Set a -> [a] forall a. Set a -> [a] Set.toList (Set a -> [a]) -> Set a -> [a] forall a b. (a -> b) -> a -> b $ Proxy s -> Set a forall {k} (s :: k) a (proxy :: k -> *). Reifies s a => proxy s -> a forall (proxy :: * -> *). proxy s -> Set a reflect (Proxy s -> Set a) -> Proxy s -> Set a forall a b. (a -> b) -> a -> b $ forall t. Proxy t forall {k} (t :: k). Proxy t Proxy @s) Proxy s -> HashSet s a forall s. Reifies s (HashSet a) => Proxy s -> HashSet s a forall r r' a. KnownHashSet r' a => Proxy r' -> HashSet r a unsafeWrapHashSet map2HashMap :: forall s k a. Hashable k => Map s k a -> HashMap s k a map2HashMap :: forall s k a. Hashable k => Map s k a -> HashMap s k a map2HashMap (Map Map k a m) = HashMap k a -> HashMap s k a forall s k a. HashMap k a -> HashMap s k a HashMap (HashMap k a -> HashMap s k a) -> HashMap k a -> HashMap s k a forall a b. (a -> b) -> a -> b $ [(k, a)] -> HashMap k a forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v HashMap.fromList ([(k, a)] -> HashMap k a) -> [(k, a)] -> HashMap k a forall a b. (a -> b) -> a -> b $ Map k a -> [(k, a)] forall k a. Map k a -> [(k, a)] Map.toList Map k a m intSet2Set :: forall s. KnownIntSet s => Set s Int intSet2Set :: forall s. KnownIntSet s => Set s Int intSet2Set = Set Int -> (forall s. Reifies s (Set Int) => Proxy s -> Set s Int) -> Set s Int forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r reify ([Int] -> Set Int forall a. [a] -> Set a Set.fromDistinctAscList ([Int] -> Set Int) -> [Int] -> Set Int forall a b. (a -> b) -> a -> b $ IntSet -> [Int] IntSet.toAscList (IntSet -> [Int]) -> IntSet -> [Int] forall a b. (a -> b) -> a -> b $ Proxy s -> IntSet forall {k} (s :: k) a (proxy :: k -> *). Reifies s a => proxy s -> a forall (proxy :: * -> *). proxy s -> IntSet reflect (Proxy s -> IntSet) -> Proxy s -> IntSet forall a b. (a -> b) -> a -> b $ forall t. Proxy t forall {k} (t :: k). Proxy t Proxy @s) Proxy s -> Set s Int forall s. Reifies s (Set Int) => Proxy s -> Set s Int forall r r' a. KnownSet r' a => Proxy r' -> Set r a unsafeWrapSet intMap2Map :: forall s a. IntMap s a -> Map s Int a intMap2Map :: forall s a. IntMap s a -> Map s Int a intMap2Map (IntMap IntMap a m) = Map Int a -> Map s Int a forall s k a. Map k a -> Map s k a Map (Map Int a -> Map s Int a) -> Map Int a -> Map s Int a forall a b. (a -> b) -> a -> b $ [(Int, a)] -> Map Int a forall k a. [(k, a)] -> Map k a Map.fromDistinctAscList ([(Int, a)] -> Map Int a) -> [(Int, a)] -> Map Int a forall a b. (a -> b) -> a -> b $ IntMap a -> [(Int, a)] forall a. IntMap a -> [(Int, a)] IntMap.toAscList IntMap a m intSet2HashSet :: forall s. KnownIntSet s => HashSet s Int intSet2HashSet :: forall s. KnownIntSet s => HashSet s Int intSet2HashSet = HashSet Int -> (forall s. Reifies s (HashSet Int) => Proxy s -> HashSet s Int) -> HashSet s Int forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r reify ([Int] -> HashSet Int forall a. (Eq a, Hashable a) => [a] -> HashSet a HashSet.fromList ([Int] -> HashSet Int) -> [Int] -> HashSet Int forall a b. (a -> b) -> a -> b $ IntSet -> [Int] IntSet.toList (IntSet -> [Int]) -> IntSet -> [Int] forall a b. (a -> b) -> a -> b $ Proxy s -> IntSet forall {k} (s :: k) a (proxy :: k -> *). Reifies s a => proxy s -> a forall (proxy :: * -> *). proxy s -> IntSet reflect (Proxy s -> IntSet) -> Proxy s -> IntSet forall a b. (a -> b) -> a -> b $ forall t. Proxy t forall {k} (t :: k). Proxy t Proxy @s) Proxy s -> HashSet s Int forall s. Reifies s (HashSet Int) => Proxy s -> HashSet s Int forall r r' a. KnownHashSet r' a => Proxy r' -> HashSet r a unsafeWrapHashSet intMap2HashMap :: forall s a. IntMap s a -> HashMap s Int a intMap2HashMap :: forall s a. IntMap s a -> HashMap s Int a intMap2HashMap (IntMap IntMap a m) = HashMap Int a -> HashMap s Int a forall s k a. HashMap k a -> HashMap s k a HashMap (HashMap Int a -> HashMap s Int a) -> HashMap Int a -> HashMap s Int a forall a b. (a -> b) -> a -> b $ [(Int, a)] -> HashMap Int a forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v HashMap.fromList ([(Int, a)] -> HashMap Int a) -> [(Int, a)] -> HashMap Int a forall a b. (a -> b) -> a -> b $ IntMap a -> [(Int, a)] forall a. IntMap a -> [(Int, a)] IntMap.toList IntMap a m hashSet2Set :: forall s a. (Ord a, KnownHashSet s a) => Set s a hashSet2Set :: forall s a. (Ord a, KnownHashSet s a) => Set s a hashSet2Set = Set a -> (forall s. Reifies s (Set a) => Proxy s -> Set s a) -> Set s a forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r reify ([a] -> Set a forall a. Ord a => [a] -> Set a Set.fromList ([a] -> Set a) -> [a] -> Set a forall a b. (a -> b) -> a -> b $ HashSet a -> [a] forall a. HashSet a -> [a] HashSet.toList (HashSet a -> [a]) -> HashSet a -> [a] forall a b. (a -> b) -> a -> b $ Proxy s -> HashSet a forall {k} (s :: k) a (proxy :: k -> *). Reifies s a => proxy s -> a forall (proxy :: * -> *). proxy s -> HashSet a reflect (Proxy s -> HashSet a) -> Proxy s -> HashSet a forall a b. (a -> b) -> a -> b $ forall t. Proxy t forall {k} (t :: k). Proxy t Proxy @s) Proxy s -> Set s a forall s. Reifies s (Set a) => Proxy s -> Set s a forall r r' a. KnownSet r' a => Proxy r' -> Set r a unsafeWrapSet hashMap2Map :: forall s k a. Ord k => HashMap s k a -> Map s k a hashMap2Map :: forall s k a. Ord k => HashMap s k a -> Map s k a hashMap2Map (HashMap HashMap k a m) = Map k a -> Map s k a forall s k a. Map k a -> Map s k a Map (Map k a -> Map s k a) -> Map k a -> Map s k a forall a b. (a -> b) -> a -> b $ [(k, a)] -> Map k a forall k a. Ord k => [(k, a)] -> Map k a Map.fromList ([(k, a)] -> Map k a) -> [(k, a)] -> Map k a forall a b. (a -> b) -> a -> b $ HashMap k a -> [(k, a)] forall k v. HashMap k v -> [(k, v)] HashMap.toList HashMap k a m hashSet2IntSet :: forall s. KnownHashSet s Int => IntSet s hashSet2IntSet :: forall s. KnownHashSet s Int => IntSet s hashSet2IntSet = IntSet -> (forall s. Reifies s IntSet => Proxy s -> IntSet s) -> IntSet s forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r reify ([Int] -> IntSet IntSet.fromList ([Int] -> IntSet) -> [Int] -> IntSet forall a b. (a -> b) -> a -> b $ HashSet Int -> [Int] forall a. HashSet a -> [a] HashSet.toList (HashSet Int -> [Int]) -> HashSet Int -> [Int] forall a b. (a -> b) -> a -> b $ Proxy s -> HashSet Int forall {k} (s :: k) a (proxy :: k -> *). Reifies s a => proxy s -> a forall (proxy :: * -> *). proxy s -> HashSet Int reflect (Proxy s -> HashSet Int) -> Proxy s -> HashSet Int forall a b. (a -> b) -> a -> b $ forall t. Proxy t forall {k} (t :: k). Proxy t Proxy @s) Proxy s -> IntSet s forall s. Reifies s IntSet => Proxy s -> IntSet s forall r r'. KnownIntSet r' => Proxy r' -> IntSet r unsafeWrapIntSet hashMap2IntMap :: forall s a. HashMap s Int a -> IntMap s a hashMap2IntMap :: forall s a. HashMap s Int a -> IntMap s a hashMap2IntMap (HashMap HashMap Int a m) = IntMap a -> IntMap s a forall s a. IntMap a -> IntMap s a IntMap (IntMap a -> IntMap s a) -> IntMap a -> IntMap s a forall a b. (a -> b) -> a -> b $ [(Int, a)] -> IntMap a forall a. [(Int, a)] -> IntMap a IntMap.fromList ([(Int, a)] -> IntMap a) -> [(Int, a)] -> IntMap a forall a b. (a -> b) -> a -> b $ HashMap Int a -> [(Int, a)] forall k v. HashMap k v -> [(k, v)] HashMap.toList HashMap Int a m