@@ -18,6 +18,7 @@
18module Roboservant.Types.Breakdown where
18module Roboservant.Types.Breakdown where
20import Data.Dynamic (Dynamic, dynTypeRep, fromDynamic, toDyn)
20import Data.Dynamic (Dynamic, dynTypeRep, fromDynamic, toDyn)
21+import Data.IORef (IORef)
21import Data.List.NonEmpty (NonEmpty)
22import Data.List.NonEmpty (NonEmpty)
22import qualified Data.List.NonEmpty as NEL
23import qualified Data.List.NonEmpty as NEL
23import qualified Data.Map.Strict as Map
24import qualified Data.Map.Strict as Map
@@ -25,25 +26,29 @@ import Data.Map.Strict (Map)
25import Data.Maybe (fromMaybe)
26import Data.Maybe (fromMaybe)
26import Data.Proxy (Proxy (..))
27import Data.Proxy (Proxy (..))
27import Data.Typeable (TypeRep, Typeable, typeRep)
28import Data.Typeable (TypeRep, Typeable, typeRep)
28−import Hedgehog (Gen)
29+import Hedgehog (Gen, Opaque, Var)
29import qualified Hedgehog.Gen as Gen
30import qualified Hedgehog.Gen as Gen
31−class Typeable x => BuildFrom x where
32+type Stash v = Map TypeRep (NonEmpty (Var (Opaque (IORef Dynamic)) v))
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))
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))
36−instance BuildFrom x => BuildFrom (Maybe x) where
39+-- instance BuildFrom x => BuildFrom (Maybe x) where
37− buildFrom dict = Nothing : fmap Just (buildFrom dict)
40+-- buildFrom dict = Nothing : fmap Just (buildFrom dict)
39class Breakdown x where
42class Breakdown x where
40− breakdown :: x -> Map TypeRep (NonEmpty Dynamic)
43+ breakdown :: x -> NonEmpty Dynamic
42-- | Can't break it down any further -- stuck in your teeth, maybe.
45-- | Can't break it down any further -- stuck in your teeth, maybe.
43newtype Chewy x = Chewy x
46newtype Chewy x = Chewy x
45instance Typeable x => Breakdown (Chewy x) where
48instance Typeable x => Breakdown (Chewy x) where
49+ breakdown x = pure (toDyn x)
46− breakdown x = let d = toDyn x in Map.fromList [(dynTypeRep d, pure d)]
51+--let d = toDyn x in Map.fromList [(dynTypeRep d, pure d)]
48-- instance (Typeable x, Generic x) => Breakdown x where
53-- instance (Typeable x, Generic x) => Breakdown x where
49-- breakdown = Map.fromListWith (<>) . fmap ((dynTypeRep &&& (\x -> NEL.fromList [x])) . toDyn . Generics.to) . _ . Generics.from
54-- breakdown = Map.fromListWith (<>) . fmap ((dynTypeRep &&& (\x -> NEL.fromList [x])) . toDyn . Generics.to) . _ . Generics.from