shithub: MicroHs

ref: b4a7a0d4c04ad0fb96d0b279d35da2658d58a0e1
dir: /lib/Data/Records.hs/

View raw version
module Data.Records(
  module Data.Proxy,
  HasField(..),
  SetField(..),
  hasField,
  composeSet,
  ) where
import Prelude()              -- do not import Prelude
import Primitives
import Data.Function
import Data.Proxy

type Get r a = r -> a
type Set r a = r -> a -> r
type GetSet r a = r -> (a, a -> r)

type  HasField :: forall (k::Kind) . k -> Type -> Type -> Constraint
class HasField x r a | x r -> a where
  getField :: Proxy x -> r -> a -- Get r a

type  SetField :: forall (k::Kind) . k -> Type -> Type -> Constraint
class SetField x r a | x r -> a where
  setField :: Proxy x -> r -> a -> r -- Set r a

hasField :: forall x r a . (HasField x r a, SetField x r a) => Proxy x -> r -> (a, a -> r)                    -- GetSet r a
hasField p r = (getField p r, setField p r)

composeSet :: forall a b c . GetSet a b -> (b -> c -> b) -> (a -> c -> a)
composeSet gs1 b_to_c_to_b a c =
  case gs1 a of
    (b, b_to_a) -> b_to_a (b_to_c_to_b b c)