-- | Labels for fields in a tuple.
--
-- Enable these extensions:
--
-- In GHCi:
--
-- @
-- :set -XOverloadedLabels -XTypeOperators -XDataKinds -XFlexibleContexts
-- @
--
-- In a module:
--
-- @
-- {-\# LANGUAGE OverloadedLabels, TypeOperators, DataKinds, FlexibleContexts \#-}
-- @
--
-- Construct a record:
--
-- >>> (#foo := "hi", #bar := 123)
-- (#foo := "hi",#bar := 123)
--
-- Get fields of a record:
--
-- >>> get #bar (#foo := "hi", #bar := 123)
-- 123
--
-- Set fields of a record:
--
-- >>> set #bar 66 (#foo := "hi", #bar := 123)
-- (#foo := "hi",#bar := 66)
--
-- Modify fields of a record:
--
-- >>> modify #mu (*0.1) (#bar := "hi", #mu := 123)
-- (#bar := "hi",#mu := 12.3)
--
-- Add fields to a record:
--
-- >>> cons (#mu := [1,2,3]) (#foo := "hi", #bar := 123)
-- (#mu := [1,2,3],#foo := "hi",#bar := 123)
--
-- Abstraction:
--
-- >>> let double field record = set field (get field record * 2) record
-- >>> double #mu (#bar := "hi", #mu := 123)
-- (#bar := "hi",#mu := 246)

module Labels
  (-- Field access
   get
  ,set
  ,modify
  ,cons
   -- Construction
  ,(:=)(..)
  ,Has
  ,Cons
  )
  where

import Labels.Internal