Selectively ported from agdARGS's Data.Recrod.SmartConstructors Please port more if you want!
record Checkable : (Field a -> Type) -> Fields a -> TypeMkCheckable : Record f flds -> Checkable f flds.mkCheckable : Checkable f flds -> Record f flds.mkCheckable : Checkable f flds -> Record f fldsmkCheckable : Checkable f flds -> Record f fldsrecord Entry : (a : (String -> Type)) -> (Field a -> Type) -> Fields a -> Type(::=) : (name : String) -> {auto 0 pos : IsYes (isField name flds)} -> f (field (toWitness pos)) -> Entry a f flds.name : Entry a f flds -> Stringname : Entry a f flds -> String0 .pos : ({rec:0} : Entry a f flds) -> IsYes (isField (name {rec:0}) flds)0 pos : ({rec:0} : Entry a f flds) -> IsYes (isField (name {rec:0}) flds).value : ({rec:0} : Entry a f flds) -> f (field (toWitness (pos {rec:0})))value : ({rec:0} : Entry a f flds) -> f (field (toWitness (pos {rec:0})))Nil : Checkable f [](::) : (entry : Entry a f flds) -> Checkable f (remove (toWitness (entry .pos))) -> Checkable f fldsrecord Inferrable : (Field a -> Type) -> Fields a -> TypeMkInferrable : Record f flds -> Inferrable f flds.mkInferrable : Inferrable f flds -> Record f flds.mkInferrable : Inferrable f flds -> Record f fldsmkInferrable : Inferrable f flds -> Record f fldsrecord Entry : (a : (String -> Type)) -> (Field a -> Type) -> Type(::=) : (name : String) -> f (name ** type) -> Entry a f.name : Entry a f -> String.type : ({rec:0} : Entry a f) -> a (name {rec:0}).value : ({rec:0} : Entry a f) -> f (name {rec:0} ** type {rec:0}).name : Entry a f -> Stringname : Entry a f -> String.type : ({rec:0} : Entry a f) -> a (name {rec:0})type : ({rec:0} : Entry a f) -> a (name {rec:0}).value : ({rec:0} : Entry a f) -> f (name {rec:0} ** type {rec:0})value : ({rec:0} : Entry a f) -> f (name {rec:0} ** type {rec:0})Nil : Inferrable f [](::) : (entry : Entry a f) -> Inferrable f flds -> {auto 0 fresh : (entry .name ** entry .type) # flds} -> Inferrable f ((entry .name ** entry .type) :: flds)BasicRecord : (Type -> Type) -> Fields (const Type) -> TypeA record where the notion of type for its fields is `Type` itself
mkBasicRecord : BasicRecord f flds -> BasicRecord f fldsThis acts as a type annotation ensuring the list passed as an
argument is a basic record.