Re: Is there a way to make this code compose generic ?

PICCA Frederic-Emmanuel <[email protected]>
Newsgroups gmane.comp.lang.haskell.cafe
Message-ID <1991245959.103939499.1745502883376.JavaMail.zimbra@synchrotron-soleil.fr>
Hello,

I am back to work :)

I started to implement a bunch of DataSources.

Which are like this

data family DSDegree (k ∷ DSKind)
data instance DSDegree DSPath
    = DataSourcePath'Degree'Hdf5 (DSWrap_ (DSDataset Z Double) DSPath)
    | DataSourcePath'Degree'Const Degree
    deriving (Generic, Show, FromJSON, ToJSON)

data instance DSDegree DSAcq
    = DataSourceAcq'Degree'Hdf5 (DSWrap_ (DSDataset Z Double) DSAcq)
    | DataSourceAcq'Degree'Const Degree
    deriving Generic

instance DataSource DSDegree where
  withDataSourceP f (DataSourcePath'Degree'Hdf5 p) g
    = withDataSourcesP f p $ λp' → g (DataSourceAcq'Degree'Hdf5 p')
  withDataSourceP _ (DataSourcePath'Degree'Const d) g = g (DataSourceAcq'Degree'Const d)


In order to use the generic implementation of ds'Shape, I need to add plenty of

instance GDataSourceAcq (K1 R Degree) where
    g'ds'Shape _ = pure shape1


Is it possible to says, the default implementation of the generic method is pure shape1
So I just need to implement the non shape1 methodes.


Thanks

Fred





generic'ds'Shape ∷ ( MonadSafe m
                   , Generic (d DSAcq)
                   , GDataSourceAcq (Rep (d DSAcq))
                   )
                 ⇒ d DSAcq → m DataSourceShape
generic'ds'Shape = g'ds'Shape ∘ from

class GDataSourceAcq dataAcq where
   g'ds'Shape ∷ MonadSafe m ⇒ dataAcq x → m DataSourceShape

instance GDataSourceAcq f ⇒ GDataSourceAcq (M1 i c f) where
	g'ds'Shape (M1 f) = g'ds'Shape f

instance (GDataSourceAcq f, GDataSourceAcq f') ⇒ GDataSourceAcq (f :*: f') where
   g'ds'Shape (f :*: f') = liftA2 combine'Shape (g'ds'Shape f) (g'ds'Shape f')

instance (GDataSourceAcq f, GDataSourceAcq f') ⇒ GDataSourceAcq (f :+: f') where
	g'ds'Shape (L1 f)  = g'ds'Shape f
   g'ds'Shape (R1 f') = g'ds'Shape f'

instance DataSource a ⇒ GDataSourceAcq (K1 i (a DSAcq)) where
	g'ds'Shape (K1 acq) = ds'Shape acq

instance GDataSourceAcq (K1 i Dataset) where
    g'ds'Shape (K1 ds) = liftIO $ ds'Shape'Dataset ds

instance GDataSourceAcq (K1 R Degree) where
    g'ds'Shape _ = pure shape1

instance GDataSourceAcq (K1 R Double) where
    g'ds'Shape _ = pure shape1

instance GDataSourceAcq (K1 R Geometry) where
    g'ds'Shape _ = pure shape1

instance GDataSourceAcq (K1 R (Text → Scannumber → Int → FilePath)) where
    g'ds'Shape _ = pure shape1

instance GDataSourceAcq (K1 R (Detector Hkl DIM2)) where
    g'ds'Shape _ = pure shape1

instance GDataSourceAcq (K1 R (IOVector a)) where
    g'ds'Shape _ = pure shape1

instance GDataSourceAcq (K1 R Text) where
    g'ds'Shape _ = pure shape1

instance GDataSourceAcq (K1 R Scannumber) where
    g'ds'Shape _ = pure shape1
_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.