{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE NoImplicitPrelude #-}

module Data.Morpheus.Server.Types.Types
  ( Undefined (..),
    Pair (..),
    MapKind (..),
    mapKindFromList,
  )
where

import Data.Functor (fmap)
import GHC.Generics
  ( Generic,
  )
import Prelude
  ( Applicative (..),
    Int,
    Show,
    length,
    uncurry,
  )

data Undefined (m :: * -> *) = Undefined deriving (Int -> Undefined m -> ShowS
[Undefined m] -> ShowS
Undefined m -> String
(Int -> Undefined m -> ShowS)
-> (Undefined m -> String)
-> ([Undefined m] -> ShowS)
-> Show (Undefined m)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall (m :: * -> *). Int -> Undefined m -> ShowS
forall (m :: * -> *). [Undefined m] -> ShowS
forall (m :: * -> *). Undefined m -> String
showList :: [Undefined m] -> ShowS
$cshowList :: forall (m :: * -> *). [Undefined m] -> ShowS
show :: Undefined m -> String
$cshow :: forall (m :: * -> *). Undefined m -> String
showsPrec :: Int -> Undefined m -> ShowS
$cshowsPrec :: forall (m :: * -> *). Int -> Undefined m -> ShowS
Show, (forall x. Undefined m -> Rep (Undefined m) x)
-> (forall x. Rep (Undefined m) x -> Undefined m)
-> Generic (Undefined m)
forall x. Rep (Undefined m) x -> Undefined m
forall x. Undefined m -> Rep (Undefined m) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall (m :: * -> *) x. Rep (Undefined m) x -> Undefined m
forall (m :: * -> *) x. Undefined m -> Rep (Undefined m) x
$cto :: forall (m :: * -> *) x. Rep (Undefined m) x -> Undefined m
$cfrom :: forall (m :: * -> *) x. Undefined m -> Rep (Undefined m) x
Generic)

data Pair k v = Pair
  { Pair k v -> k
key :: k,
    Pair k v -> v
value :: v
  }
  deriving ((forall x. Pair k v -> Rep (Pair k v) x)
-> (forall x. Rep (Pair k v) x -> Pair k v) -> Generic (Pair k v)
forall x. Rep (Pair k v) x -> Pair k v
forall x. Pair k v -> Rep (Pair k v) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall k v x. Rep (Pair k v) x -> Pair k v
forall k v x. Pair k v -> Rep (Pair k v) x
$cto :: forall k v x. Rep (Pair k v) x -> Pair k v
$cfrom :: forall k v x. Pair k v -> Rep (Pair k v) x
Generic)

data MapKind k v m = MapKind
  { MapKind k v m -> Int
size :: Int,
    MapKind k v m -> m [Pair k v]
pairs :: m [Pair k v]
  }
  deriving ((forall x. MapKind k v m -> Rep (MapKind k v m) x)
-> (forall x. Rep (MapKind k v m) x -> MapKind k v m)
-> Generic (MapKind k v m)
forall x. Rep (MapKind k v m) x -> MapKind k v m
forall x. MapKind k v m -> Rep (MapKind k v m) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall k v (m :: * -> *) x. Rep (MapKind k v m) x -> MapKind k v m
forall k v (m :: * -> *) x. MapKind k v m -> Rep (MapKind k v m) x
$cto :: forall k v (m :: * -> *) x. Rep (MapKind k v m) x -> MapKind k v m
$cfrom :: forall k v (m :: * -> *) x. MapKind k v m -> Rep (MapKind k v m) x
Generic)

mapKindFromList :: (Applicative m) => [(k, v)] -> MapKind k v m
mapKindFromList :: [(k, v)] -> MapKind k v m
mapKindFromList [(k, v)]
inputPairs =
  MapKind :: forall k v (m :: * -> *). Int -> m [Pair k v] -> MapKind k v m
MapKind
    { size :: Int
size = [(k, v)] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [(k, v)]
inputPairs,
      pairs :: m [Pair k v]
pairs = m [Pair k v]
resolvePairs
    }
  where
    resolvePairs :: m [Pair k v]
resolvePairs = [Pair k v] -> m [Pair k v]
forall (f :: * -> *) a. Applicative f => a -> f a
pure (((k, v) -> Pair k v) -> [(k, v)] -> [Pair k v]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((k -> v -> Pair k v) -> (k, v) -> Pair k v
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry k -> v -> Pair k v
forall k v. k -> v -> Pair k v
Pair) [(k, v)]
inputPairs)