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 forall a b. a -> b
unsafeCoerce forall {k} (a :: k). a :~: a
Refl :: r :~: r' of r :~: r'
Refl -> 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 forall a b. a -> b
unsafeCoerce forall {k} (a :: k). a :~: a
Refl :: r :~: r' of r :~: r'
Refl -> 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 forall a b. a -> b
unsafeCoerce forall {k} (a :: k). a :~: a
Refl :: r :~: r' of r :~: r'
Refl -> 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 = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify
  ([Int] -> IntSet
IntSet.fromDistinctAscList forall a b. (a -> b) -> a -> b
$ forall a. Set a -> [a]
Set.toAscList forall a b. (a -> b) -> a -> b
$ forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @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) = forall s a. IntMap a -> IntMap s a
IntMap forall a b. (a -> b) -> a -> b
$ forall a. [(Int, a)] -> IntMap a
IntMap.fromDistinctAscList forall a b. (a -> b) -> a -> b
$ 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 = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify
  (forall a. (Eq a, Hashable a) => [a] -> HashSet a
HashSet.fromList forall a b. (a -> b) -> a -> b
$ forall a. Set a -> [a]
Set.toList forall a b. (a -> b) -> a -> b
$ forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @s)
  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) = forall s k a. HashMap k a -> HashMap s k a
HashMap forall a b. (a -> b) -> a -> b
$ forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HashMap.fromList forall a b. (a -> b) -> a -> b
$ 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 = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify
  (forall a. [a] -> Set a
Set.fromDistinctAscList forall a b. (a -> b) -> a -> b
$ IntSet -> [Int]
IntSet.toAscList forall a b. (a -> b) -> a -> b
$ forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @s)
  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) = forall s k a. Map k a -> Map s k a
Map forall a b. (a -> b) -> a -> b
$ forall k a. [(k, a)] -> Map k a
Map.fromDistinctAscList forall a b. (a -> b) -> a -> b
$ 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 = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify
  (forall a. (Eq a, Hashable a) => [a] -> HashSet a
HashSet.fromList forall a b. (a -> b) -> a -> b
$ IntSet -> [Int]
IntSet.toList forall a b. (a -> b) -> a -> b
$ forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @s)
  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) = forall s k a. HashMap k a -> HashMap s k a
HashMap forall a b. (a -> b) -> a -> b
$ forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HashMap.fromList forall a b. (a -> b) -> a -> b
$ 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 = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify
  (forall a. Ord a => [a] -> Set a
Set.fromList forall a b. (a -> b) -> a -> b
$ forall a. HashSet a -> [a]
HashSet.toList forall a b. (a -> b) -> a -> b
$ forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @s)
  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) = forall s k a. Map k a -> Map s k a
Map forall a b. (a -> b) -> a -> b
$ forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList forall a b. (a -> b) -> a -> b
$ 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 = forall a r. a -> (forall s. Reifies s a => Proxy s -> r) -> r
reify
  ([Int] -> IntSet
IntSet.fromList forall a b. (a -> b) -> a -> b
$ forall a. HashSet a -> [a]
HashSet.toList forall a b. (a -> b) -> a -> b
$ forall {k} (s :: k) a (proxy :: k -> *).
Reifies s a =>
proxy s -> a
reflect forall a b. (a -> b) -> a -> b
$ forall {k} (t :: k). Proxy t
Proxy @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) = forall s a. IntMap a -> IntMap s a
IntMap forall a b. (a -> b) -> a -> b
$ forall a. [(Int, a)] -> IntMap a
IntMap.fromList forall a b. (a -> b) -> a -> b
$ forall k v. HashMap k v -> [(k, v)]
HashMap.toList HashMap Int a
m