# Extra.hs

Plain text version of Extra.hs

```module Extra where
import Ix
import Data.Set(Set,toList)

```

Here is a convenient way to obtain a list of all values of a given type, e.g. all states in a model.

```enumAll :: (Bounded a,Ix a) => [a]
enumAll = range (minBound,maxBound)

```

The ShowBits class provides a way to print bit vectors, represented as tuples of booleans, in a compact and readable way, e.g. 010 instead of (False,(True,False))

```class ShowBits s where showBits :: s -> ShowS

```

Single booleans are shown as 0 and 1 instead of False and True.

```instance ShowBits Bool where showBits = shows . fromEnum

```

Pairs of bit vectors are just concatenated.

```instance (ShowBits a,ShowBits b) => ShowBits (a,b) where
showBits (a,b) = showBits a . showBits b

```

When showing a list or a set of bit vectors, the elements are separated by spaces.

```instance ShowBits a => ShowBits [a] where
showBits = foldr (\x r->showBits x.(' ':).r) id

instance ShowBits a => ShowBits (Set a) where
showBits = showBits . toList

```

Use B v if you want to display a bit vector v in the compact readable way.

```newtype B a = B a

instance ShowBits a => Show (B a) where
showsPrec _ (B a) = showBits a

```

A type for transitions and a nice way to show them

```data Trans s1 s2 = s1 :-> s2

instance (ShowBits s1,ShowBits s2) => Show (Trans s1 s2) where
showsPrec _ (s1:->s2) = showBits s1 . (" -> "++) . showBits s2
showList = showsLines

showsLines xs r = foldr showsLine r xs
where showsLine x r = shows x ('\n':r)
```