public static void WriteIntoPacket(OutBlob stream,
                                           [NotNull] IEnumerable <IUpdateSegment> syncSegments,
                                           [NotNull] IEnumerable <IUpdateSegment> initializeSegments,
                                           [NotNull] IEnumerable <IUpdateSegment> flagSegments,
                                           int numIdBits, int maxIdValue)
        {
            stream.BeginBitAccess();

            WriteSyncSegments(stream, syncSegments);
            WriteInitSegments(stream, initializeSegments);

            // avoid double enumeration of the flagSegments enumerable
            var enumeratedUpdateSegments =
                flagSegments as IList <IUpdateSegment> ?? flagSegments.ToList();

            WriteInitSegmentsEndMarkerIfNeeded(stream, enumeratedUpdateSegments, numIdBits, maxIdValue);

            stream.EndBitAccess();

            WriteFlagSegments(stream, enumeratedUpdateSegments);
        }