-- | List type that supports O(1) amortized 'cons', 'snoc', 'uncons' and 'isEmpty'.moduleGeneral.Bilist(Bilist ,cons ,snoc ,uncons ,toList ,isEmpty )whereimportData.SemigroupimportPreludedataBilist a =Bilist [a ][a ]toList::Bilist a ->[a ]toList (Bilist asbs )=as++reversebs isEmpty::Bilist a ->BoolisEmpty (Bilist asbs )=nullas&&nullbs instanceEqa =>Eq(Bilist a )wherea == b =toList a ==toList b instanceSemigroup(Bilist a )wherea <> b =Bilist (toList a ++toList b )[]instanceMonoid(Bilist a )wheremempty =Bilist [][]mappend =(<>)cons::a ->Bilist a ->Bilist a cons x (Bilist asbs )=Bilist (x :as)bs snoc::Bilist a ->a ->Bilist a snoc (Bilist asbs )x =Bilist as(x :bs )uncons::Bilist a ->Maybe(a ,Bilist a )uncons (Bilist [][])=Nothinguncons(Bilist (a :as)bs )=Just(a ,Bilist asbs )uncons(Bilist []bs )=uncons $Bilist (reversebs )[]