@@ -18,6 +18,7 @@
1818module Roboservant.Types.Breakdown where
1919
2020import Data.Dynamic (Dynamic, dynTypeRep, fromDynamic, toDyn)
21+import Data.IORef (IORef)
2122import Data.List.NonEmpty (NonEmpty)
2223import qualified Data.List.NonEmpty as NEL
2324import qualified Data.Map.Strict as Map
@@ -25,25 +26,29 @@ import Data.Map.Strict (Map)
2526import Data.Maybe (fromMaybe)
2627import Data.Proxy (Proxy (..))
2728import Data.Typeable (TypeRep, Typeable, typeRep)
28−import Hedgehog (Gen)
29+import Hedgehog (Gen, Opaque, Var)
2930import qualified Hedgehog.Gen as Gen
3031
31−class Typeable x => BuildFrom x where
32− buildFrom :: Map TypeRep (NonEmpty Dynamic) -> [x]
33− default buildFrom :: Map TypeRep (NonEmpty Dynamic) -> [x]
34− buildFrom = maybe [] (fmap promisedDyn . NEL.toList) . Map.lookup (typeRep (Proxy @x))
32+type Stash v = Map TypeRep (NonEmpty (Var (Opaque (IORef Dynamic)) v))
3533
36−instance BuildFrom x => BuildFrom (Maybe x) where
37− buildFrom dict = Nothing : fmap Just (buildFrom dict)
34+-- class Typeable x => BuildFrom x where
35+-- buildFrom :: Stash -> [x]
36+-- default buildFrom :: Map TypeRep (NonEmpty Dynamic) -> [x]
37+-- buildFrom = maybe [] (fmap promisedDyn . NEL.toList) . Map.lookup (typeRep (Proxy @x))
38+
39+-- instance BuildFrom x => BuildFrom (Maybe x) where
40+-- buildFrom dict = Nothing : fmap Just (buildFrom dict)
3841
3942class Breakdown x where
40− breakdown :: x -> Map TypeRep (NonEmpty Dynamic)
43+ breakdown :: x -> NonEmpty Dynamic
4144
4245-- | Can't break it down any further -- stuck in your teeth, maybe.
4346newtype Chewy x = Chewy x
4447
4548instance Typeable x => Breakdown (Chewy x) where
46− breakdown x = let d = toDyn x in Map.fromList [(dynTypeRep d, pure d)]
49+ breakdown x = pure (toDyn x)
50+
51+--let d = toDyn x in Map.fromList [(dynTypeRep d, pure d)]
4752
4853-- instance (Typeable x, Generic x) => Breakdown x where
4954-- breakdown = Map.fromListWith (<>) . fmap ((dynTypeRep &&& (\x -> NEL.fromList [x])) . toDyn . Generics.to) . _ . Generics.from