module Mischief.Assets.Internal.Kdl.Collection where

import Data.Data
import Data.Map (Map)
import Data.Map qualified as Map
import Data.Maybe
import Data.Text (Text)
import KDL qualified
import Mischief.ECS.Utils

newtype KdlCollection a = KdlCollection (Map Text [a]) deriving (Int -> KdlCollection a -> ShowS
[KdlCollection a] -> ShowS
KdlCollection a -> String
(Int -> KdlCollection a -> ShowS)
-> (KdlCollection a -> String)
-> ([KdlCollection a] -> ShowS)
-> Show (KdlCollection a)
forall a. Show a => Int -> KdlCollection a -> ShowS
forall a. Show a => [KdlCollection a] -> ShowS
forall a. Show a => KdlCollection a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> KdlCollection a -> ShowS
showsPrec :: Int -> KdlCollection a -> ShowS
$cshow :: forall a. Show a => KdlCollection a -> String
show :: KdlCollection a -> String
$cshowList :: forall a. Show a => [KdlCollection a] -> ShowS
showList :: [KdlCollection a] -> ShowS
Show)

colGetU :: Text -> KdlCollection a -> a
colGetU :: forall a. Text -> KdlCollection a -> a
colGetU = (Maybe a -> a
forall (f :: * -> *) a. (HasCallStack, Unwrappable f) => f a -> a
unwrap (Maybe a -> a)
-> (KdlCollection a -> Maybe a) -> KdlCollection a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
.) ((KdlCollection a -> Maybe a) -> KdlCollection a -> a)
-> (Text -> KdlCollection a -> Maybe a)
-> Text
-> KdlCollection a
-> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> KdlCollection a -> Maybe a
forall a. Text -> KdlCollection a -> Maybe a
colGet

colGet :: Text -> KdlCollection a -> Maybe a
colGet :: forall a. Text -> KdlCollection a -> Maybe a
colGet Text
a KdlCollection a
b = case Text -> KdlCollection a -> [a]
forall a. Text -> KdlCollection a -> [a]
colGetMany Text
a KdlCollection a
b of
  (a
x : [a]
_) -> a -> Maybe a
forall a. a -> Maybe a
Just a
x
  [a]
_ -> Maybe a
forall a. Maybe a
Nothing

colGetMany :: Text -> KdlCollection a -> [a]
colGetMany :: forall a. Text -> KdlCollection a -> [a]
colGetMany Text
t (KdlCollection Map Text [a]
m) = [a] -> Maybe [a] -> [a]
forall a. a -> Maybe a -> a
fromMaybe [] (Text -> Map Text [a] -> Maybe [a]
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup Text
t Map Text [a]
m)

colDecodeWith :: (Typeable a) => KDL.NodeDecoder a -> KDL.NodeListDecoder (KdlCollection a)
colDecodeWith :: forall a.
Typeable a =>
NodeDecoder a -> NodeListDecoder (KdlCollection a)
colDecodeWith = (Map Text [a] -> KdlCollection a
forall a. Map Text [a] -> KdlCollection a
KdlCollection (Map Text [a] -> KdlCollection a)
-> DecodeArrow NodeList () (Map Text [a])
-> DecodeArrow NodeList () (KdlCollection a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>) (DecodeArrow NodeList () (Map Text [a])
 -> DecodeArrow NodeList () (KdlCollection a))
-> (NodeDecoder a -> DecodeArrow NodeList () (Map Text [a]))
-> NodeDecoder a
-> DecodeArrow NodeList () (KdlCollection a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NodeDecoder a -> DecodeArrow NodeList () (Map Text [a])
forall a b.
Typeable b =>
NodeDecodeArrow a b -> NodeListDecodeArrow a (Map Text [b])
KDL.remainingNodesWith