wakame-0.1.0.0: src/Wakame/Nub.hs
{-# LANGUAGE UndecidableSuperClasses #-}
module Wakame.Nub where
import Prelude
import Wakame.Row (NP (..), Row, V)
-- $setup
-- >>> import Wakame
-- | Typeclass for reshaping fields
-- `nub` function eliminates duplicate fileds.
-- When duplication, the first element takes precedence.
-- It also reorders fields so to match the return type.
--
-- >>> toRow (keyed @"x" 42.0, keyed @"x" 56.4)
-- (x: 42.0) :* (x: 56.4) :* Nil
-- >>> nub $ toRow (keyed @"x" 42.0, keyed @"x" 56.4) :: Row '[ '("x", Double)]
-- (x: 42.0) :* Nil
class Nub s t where
nub :: Row s -> Row t
instance Nub s '[] where
nub _ = Nil
instance (Nub s t, HasField s p) => Nub s (p ': t) where
nub x = getField x :* nub x
-- | Typeclass to pick a first matched field
class HasField r p where
getField :: Row r -> V p
instance {-# OVERLAPS #-} HasField (p ': rs) p where
getField (x :* _) = x
instance HasField rs p => HasField (r ': rs) p where
getField (_ :* xs) = getField xs