Size: a a a

2020 December 12

DB

Danil Berestov in Haskell
Jerzy Syrowiecki
нет, я могу неправильно понимать твою задачу. сначала ты набросай прототип решения
Я могу на скале показать, как бы это было. Так сойдёт?
источник

JS

Jerzy Syrowiecki in Haskell
да
источник

к

кана in Haskell
берется любая либа расширяемых рекордов, скажем тот же винил. Пишем на генериках функцию из дата-рекорда в этот анонимный рекорд. Добавляем поля
источник

DB

Danil Berestov in Haskell
Сообразил на хаскеле. Во, примерно такое
data User = User { name :: String, email :: String }

searchOld :: (WithID a, WithEntity entity a, WithEntity entity b, WithVersion entity b, WithID b) => a -> IO (Maybe b)
searchOld = ...

saveEntity :: (WithID a, WithEntity a) => a -> IO ()
saveEntity new = do
   old <- searchOld entity
   if getEntity <$> old == Just (getEntity new)
       then save $ withVersion 1 new
       else save $ withVersion (fromJust (getVersion <$> old) + 1) new

save
:: (WithID a, WithEntity entity a, WithVersion a) => IO ()
save
= ...
источник

AA

A64m AL256m qn<co... in Haskell
в такого типа либах, тем более, конвертор из обычного рекорда в анонимный уже часто есть
источник

DB

Danil Berestov in Haskell
Danil Berestov
Сообразил на хаскеле. Во, примерно такое
data User = User { name :: String, email :: String }

searchOld :: (WithID a, WithEntity entity a, WithEntity entity b, WithVersion entity b, WithID b) => a -> IO (Maybe b)
searchOld = ...

saveEntity :: (WithID a, WithEntity a) => a -> IO ()
saveEntity new = do
   old <- searchOld entity
   if getEntity <$> old == Just (getEntity new)
       then save $ withVersion 1 new
       else save $ withVersion (fromJust (getVersion <$> old) + 1) new

save
:: (WithID a, WithEntity entity a, WithVersion a) => IO ()
save
= ...
написал по-дэбильному, конечно
источник

DB

Danil Berestov in Haskell
Danil Berestov
Сообразил на хаскеле. Во, примерно такое
data User = User { name :: String, email :: String }

searchOld :: (WithID a, WithEntity entity a, WithEntity entity b, WithVersion entity b, WithID b) => a -> IO (Maybe b)
searchOld = ...

saveEntity :: (WithID a, WithEntity a) => a -> IO ()
saveEntity new = do
   old <- searchOld entity
   if getEntity <$> old == Just (getEntity new)
       then save $ withVersion 1 new
       else save $ withVersion (fromJust (getVersion <$> old) + 1) new

save
:: (WithID a, WithEntity entity a, WithVersion a) => IO ()
save
= ...
вот тута я налету прицепил версию
источник

к

кана in Haskell
так, а почему ты отклонил винил?
источник

DB

Danil Berestov in Haskell
Я не то, что отклонил его. Просто он страшный какой-то
источник

к

кана in Haskell
согласен
источник

к

кана in Haskell
можешь посмотреть на это

https://github.com/juspay/jrec

оно простое
источник

DB

Danil Berestov in Haskell
О, енто ваше
источник

к

кана in Haskell
но мб не стоит, оно даже на хакадж не выложено, тогда можно посмотреть на суперрекорд
источник

DB

Danil Berestov in Haskell
кана
но мб не стоит, оно даже на хакадж не выложено, тогда можно посмотреть на суперрекорд
а чому не выложили?
источник

к

кана in Haskell
не знаю, лень было всем, это в основном для локального использования, но на всякий случай заопенсоршено
источник

DB

Danil Berestov in Haskell
А есть примеры использования?
источник

к

кана in Haskell
мне кажется можно сделать вот что

data With name a b = With a b

instance HasField name (With name a b) a
instance HasField name r a => HasField (With name' a r) a

HasField из GHC.Records.Extra

только поиграться с инстансами

и получить расширяемые рекорды с генерик-линзами и без анонимификации
источник

к

кана in Haskell
будет With "flag" User Bool
источник

DB

Danil Berestov in Haskell
Ну вишь енто надо руками много писать
источник

к

кана in Haskell
да вроде не много, и только один раз
источник