turingjump / bookkeeper

BSD 3-Clause "New" or "Revised" License
55 stars 17 forks source link

From/ToJSON instances #11

Open jkarni opened 8 years ago

jkarni commented 8 years ago

As a separate library.

pkamenarsky commented 8 years ago

This is what I came up with:

instance A.ToJSON (Book' '[])
instance (A.ToJSON (Book' m), A.ToJSON v) => A.ToJSON (Book' (k :=> v ': m))

instance A.FromJSON (Book' '[])
instance (A.FromJSON (Book' m), A.FromJSON v) => A.FromJSON (Book' (k :=> v ': m))

instance Generic (Book' '[]) where
  type Rep (Book' '[]) = U1
  from _ = U1
  to _   = Book (Map.Empty)

instance {- (Generic (Book' m)) => -} Generic (Book' (k :=> v ': m)) where
  -- type Rep (Book' (k :=> v ': m)) = S1 ('MetaSel ('Just k) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 v) :*: Rep (Book' m)
  -- from (Book (Map.Ext k v m)) = M1 (K1 v) :*: from (Book m)
  -- to (M1 (K1 v) :*: m) = Book (Map.Ext (Map.Var :: Map.Var k) v (getBook (to m)))

  type Rep (Book' (k :=> v ': m)) = S1 ('MetaSel ('Just k) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 v) :*: S1 ('MetaSel ('Just k) 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Book' m))
  from (Book (Map.Ext k v m)) = M1 (K1 v) :*: (M1 (K1 (Book m)))
  to (M1 (K1 v) :*: (M1 (K1 (Book m)))) = Book (Map.Ext (Map.Var :: Map.Var k) v m)

But this is not ideal. The commented Generic (Book' m)) overlaps with aeson instances. Not sure what the best solution would be.

jkarni commented 8 years ago

The commented Generic (Book' m)) overlaps with aeson instances

What do you mean by that? I don't quite see it.