@hackage / fcf-composite

Type-level computation for composite using first-class-families.

Latest0.1.1.0

About

Metadata

  • Last updated , by locallycompact
  • License MIT
  • Categories Type System
  • Maintained by: dan.firth@homotopic.tech

  • Lottery factor: 0

Links

Installation

Readme

fcf-composite

first-class-families support for composite records. This gives bidirection between a composite style [s :-> a] and MapC s a from fcf-containers.

Using this we can compute record types via the Map operations in Fcf.

data Difference :: [Type] -> [Type] -> Exp [Type]

type instance Eval (Difference xs ys) = Eval (ToComposite =<< Fcf.Data.MapC.Difference (Eval (FromComposite xs)) (Eval (FromComposite ys)))

type A = ["a" :-> Int, "b" :-> String, "c" :-> ()]

type B = ["a" :-> Int, "c" :-> ()]

myRec :: Record (Eval (Difference A B))
myRec = "foo" :*: RNil -- checks!

Note: The ordering of the fields is predictable, but not obvious and commutations matter, so you may need to use rcast liberally.