From 8db33035826609bf48e15a82742981a58a0b5982 Mon Sep 17 00:00:00 2001 From: Tom Smeding Date: Sat, 26 Apr 2025 10:27:39 +0200 Subject: Refactor the clever replicate-aware Show instances --- src/Data/Bag.hs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/Data/Bag.hs (limited to 'src/Data/Bag.hs') diff --git a/src/Data/Bag.hs b/src/Data/Bag.hs new file mode 100644 index 0000000..84c770a --- /dev/null +++ b/src/Data/Bag.hs @@ -0,0 +1,18 @@ +{-# LANGUAGE DeriveTraversable #-} +module Data.Bag where + + +-- | An ordered sequence that can be folded over. +data Bag a = BZero | BOne a | BTwo (Bag a) (Bag a) | BList [Bag a] + deriving (Functor, Foldable, Traversable) + +-- Really only here for 'pure' +instance Applicative Bag where + pure = BOne + BZero <*> _ = BZero + BOne f <*> t = f <$> t + BTwo f1 f2 <*> t = BTwo (f1 <*> t) (f2 <*> t) + BList fs <*> t = BList [f <*> t | f <- fs] + +instance Semigroup (Bag a) where (<>) = BTwo +instance Monoid (Bag a) where mempty = BZero -- cgit v1.2.3-70-g09d2