úÎ!7Š4=      !"#$%&'()*+,-./0123456789:;<(c) Samuel Schlesinger 2020MITsgschlesinger@gmail.com experimental non-portableNone%-./=>?@AHISUVXkLsummerCA typeclass to rearrange and possibly remove things from a product.summerZA typeclass that is useful to define the scott encoding/decoding for extensible products.summer8This is a reified pattern match on an extensible productsummerDType family for replacing one type in a type level list with another summeraA class that is used for convenience in order to make certain type signatures read more clearly. summerDA type family for computing the initial segment of a type level list summer9A type family for computing the tail of a type level list summer;A type family for computing the length of a type level listsummerCA type family for computing the index of a type in a list of types.summerAn extensible product typesummerBComputes the index of the given type in the given type level list.summer%Extract a value at a particular indexsummer2Takes the tail of a product after the nth element.summer0Takes the initial length n segment of a product.summerwDrop the first element of a product. Sometimes needed for better type inference and less piping around of constraints.summer-Replaces one type with another via a function   (c) Samuel Schlesinger 2020MITsgschlesinger@gmail.com experimental non-portableNone%-./=>?@AHISUVX_gk3rsummer6A utility typeclass which makes the implementation of  cleaner.summer.A typeclass for scott encoding extensible sums"summer'The scott encoding of an extensible sum#summerDTransforming one sum into a sum which contains all of the same types%summer›A class which checks that every type has the same tag in the first list as the second. In other words, checks if the first list is a prefix of the other.&summer5A type family for deleting the given type from a list'summeraA class that is used for convenience in order to make certain type signatures read more clearly.(summerœA type family for computing the tag of a given type in an extensible sum. In practice, this means computing the first index of the given type in the list.)summer`The extensible sum type, allowing inhabitants to be of any of the types in the given type list.*summerbA pattern to match on for convenience. Without this, the user facing interface is rather baroque.+summer@Computes the tag of the given type in the given type level list.,summer'Injects a type into the extensible sum.-summer1Inspects an extensible sum for a particular type..summerRConsider a certain type, discarding it as an option if it is not the correct one.=summerbConsider the first type in the list of possibilities, a useful specialization for type inference./summer,Transforms one type in the sum into another.0summer?Transform one type in one sum into another type in another sum.1summermA free version of weakening, where all you're doing is adding more possibilities at exclusively higher tags.3summer%Testing extensible sums for equality.! "#$%&'()*+,-./01)*+,-.! ('&%"#$1/0>      !"#$%&'()*+,-./0123456789:;<=>?@A%summer-0.1.2.0-AgENOXXjIj94NEIrKPYuTR Data.Prodder Data.Summer Strengthen strengthenConsumeconsumeproduceextend1cmapConsumerReplace<> HasIndexInInitTailLengthIndexInProdindexextracttailNinitN dropFirstremap$fEqProd $fEqProd0$fHasIndexInkxxs $fConsume: $fConsume[]$fStrengthenxs[]$fStrengthenxs:UnmatchMatchmatchunmatchoverrideMatcherWeakenweakenHaveSameTagsInDeleteHasTagInTagInSumInjtaginjectinspectconsiderinmapsmap noOpWeaken$fEqSum$fEqSum0$fHasTagInkxxs$fHaveSameTagsIn[][]::$fHaveSameTagsIn[]k[]ys $fWeaken[]ys $fWeaken:ys $fMatch[] $fUnmatch:ys $fUnmatch[]ys$fMatch: considerFirst