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