# fcf-composite
Fcf support for [composite](https://hackage.haskell.org/package/composite-base) records. This gives bidirection between a composite
style `[s :-> a]` and `MapC s a` from
[fcf-containers](https://hackage.haskell.org/package/fcf-containers).
Using this we can compute record types via the Map
[operations](https://hackage.haskell.org/package/fcf-containers-0.6.0/docs/Fcf-Data-MapC.html)
in Fcf.
```{.haskell}
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: Since `ToComposite` and `FromComposite` use `ToList` and `FromList` from
Fcf.Data.MapC, then the fields will always be returned in alphabetical order
according to the symbol name, so you may need to use `rcast`.